2016-11-22 46 views
1

facet_grid()を使用して複数のプロットをプロットしようとしています。それぞれのファセットに対して、異なるファクターレベルのサブセットを手動でX軸に沿ってプロットしたいと考えています。ggplotファセット内のファクタの順序を変更

は基本的に私は、各X軸上の上位5カ国(手動で定義)をプロットしたい、と私はgrid.arrange()(例を参照)との代替ソリューションを使用することができますが、私は維持するためにfacet_grid()またはfacet_wrap()でそれをしたいと思います残りの私のプロットと同じ美学です。

ファクタレベルでファセットを並べ替える答えを見つけることができました。私は注文審美的なものを試してみましたが、成功しなかったので、私はそれを認識していますが、これを行う方法があるかどうか疑問ですggplotでの面取りは、軸の変更を念頭に置いて設計されていません。私はこれに関するいくつかのアドバイスを感謝します。

ここには、私が望むものの再現可能な例があります(手動でX軸の順序を定義しました)。

library(reshape) 
library(ggplot2) 
library(gridExtra) 

# Load data 
mtcars_melt <- melt(mtcars) 

# Subset data 
set1 <- subset(mtcars_melt, variable == "mpg" | variable == "wt" | variable == "qsec") 
set2 <- subset(mtcars_melt, variable == "gear" | variable == "cyl" | variable == "mpg") 
set3 <- subset(mtcars_melt, variable == "drat" | variable == "vs" | variable == "mpg") 

# Order factors 
set1$variable <- factor(set1$variable, levels = c("mpg", "wt", "qsec")) 
set2$variable <- factor(set2$variable, levels = c("mpg", "gear", "cyl")) 
set3$variable <- factor(set3$variable, levels = c("vs", "mpg", "drat")) 

# Make plots 
plot1 <- ggplot(set1, aes(x = variable, y = value)) + ylim(0, 35) + geom_boxplot() 
plot2 <- ggplot(set2, aes(x = variable, y = value)) + ylim(0, 35) + geom_boxplot() 
plot3 <- ggplot(set3, aes(x = variable, y = value)) + ylim(0, 35) + geom_boxplot() 

grid.arrange(plot1, plot2, plot3, ncol = 3) 

これはプロットの例です(申し訳ありませんが、画像を直接投稿するにはさらに多くの担当者が必要です)。 Example plot

+1

これが不可能な場合、私は驚かないだろう。 facet_grid/wrapのポイントは、ファセットを比較可能にすることです。今のところ、軸のスケールのみが調整可能であり、ある軸に沿った実際の値を交換することによって、いくつかの円では不誠実と認識される可能性があります。 –

+0

私は、主なアプローチは、x変数とファセット変数の組み合わせである新しい要素を作成し、それをx変数として使用することです。参照してください[here](http://stackoverflow.com/questions/12064007/factor-order-within-faceted-dotplot-using-ggplot2) – aosmith

+0

@chenga他のプロットと同じ美学ではどういう意味ですか?私はあなたがgrid.arrange内でそれを行うことができると思う。 – timat

答えて

1

嫌なハックはどうですか?

これは、サブセットを新しいdataframeに組み合わせたものです。その後、各変数を一意にするために、変数にセット番号を連結した列を追加します。問題は、これが連結名なので、これはx軸の名前に影響します。これを回避するには、軸名を削除して代わりにgeom_textを使用するこのハックR: Reorder facet_wrapped x-axis with free_x in ggplot2に従った。

enter image description here

mtcars_melt <- melt(mtcars) 

# Subset data 
set1 <- subset(mtcars_melt, variable == "mpg" | variable == "wt" | variable == "qsec") 
set2 <- subset(mtcars_melt, variable == "gear" | variable == "cyl" | variable == "mpg") 
set3 <- subset(mtcars_melt, variable == "drat" | variable == "vs" | variable == "mpg") 

# Order factors 
set1$variable <- factor(set1$variable, levels = c("mpg", "wt", "qsec")) 
set2$variable <- factor(set2$variable, levels = c("mpg", "gear", "cyl")) 
set3$variable <- factor(set3$variable, levels = c("vs", "mpg", "drat")) 


names(set1)[2]<-"set1" 
names(set2)[2]<-"set2" 
names(set3)[2]<-"set3" 


mset1<-melt(set1) 
mset2<-melt(set2) 
mset3<-melt(set3) 

library(data.table) 
new<-as.data.frame(rbindlist(list(mset1,mset2,mset3))) 
names(new)[2]<-'setno' 

new$lvl <- with(new,paste(variable,setno,sep=".")) 
new$lvl<-as.factor(new$lvl) 
new$lvl<-factor(new$lvl,levels=c("mpg.set1","wt.set1","qsec.set1","mpg.set2","gear.set2","cyl.set2", "vs.set3" , "mpg.set3","drat.set3")) 


plot1 <- ggplot(new, aes(x = lvl, y = value)) + ylim(0, 35) + geom_boxplot()+ 
    facet_wrap(~setno,scales="free_x")+ 
    ylim(-2,NA)+ 
    geom_text(aes(y=-1,label=variable),angle=45,size=5,hjust=1)+ 
    theme(axis.text.x = element_blank(), 
     axis.title.x = element_blank(), 
     axis.line.x = element_blank(), 
     axis.ticks.x = element_blank())+ 
    geom_hline(aes(yintercept=0)) 
+0

@chengaこれは役に立ちましたか? –

+1

こんにちはJ.Con、はい、これは非常に便利で、私が気づいていなかった本当に面白いアプローチでした。しかし、私が望むようにプロットを得るために時間を費やしましたが、私の例はこれらのプロットより少し複雑です(ログy軸などが必要です)ので、最後にはまだグリッドを選択しました。アレンジ()'。興味深い例をありがとうがありがとう。 @timat - 'facet_wrap()'プロットは、(私がある程度模倣することができる)特定の外観を持っているので、私は一様な外観を持たなければならないすべてのプロットを求めていました。 "同じ美学"。 – chenga

関連する問題