2012-12-13 20 views
8

私が達成しようとしているのは、バーをパネルごとの変数で並べることです。facet_wrapを使用するときのgeom_barの並べ替え

簡単な例:

library(ggplot2) 
    library(plyr) 

    df <- data.frame(fac = c("a", "b", "c", "e", "b", "c", "d"),    
        val = c(1, 2, 7, 4, 5, 3, 1), 
        group = c(1, 1, 1, 1, 2, 2, 2)) 

    p1 <- ggplot(df, aes(x = fac, y = val)) + geom_bar() + facet_wrap(~ group, scales = "free") + coord_flip() 
    p1 

    p2 <- ggplot(df, aes(x = reorder(fac, val), y = val)) + geom_bar() + facet_wrap(~ group, scales = "free") + coord_flip() 
    p2 

p2はなく、すべての「因子レベルは、」すべてのパネルに表示されますので、私が欲しいものを生成しません。この問題にはすでに簡単な解決策がありますか?

私が見つけた1つの解決策は、次のとおりです(グループごとの各要因レベルのランクを計算します)。

df2 <- ddply(df, .(group), transform, fac2 = rank(val)) 
df2$fac2 <- factor(df2$fac2) 
p3 <- ggplot(df2, aes(x = fac2, y = val)) + facet_wrap(~ group, scales = "free") + geom_bar(stat = "identity") + coord_flip() + 
    opts(panel.margin = unit(2, "lines")) 
p3 

私は自分でラベルを設定する必要があります。考えられる解決策の1つは次のとおりです(この例ではハードコード)。

grid.newpage() 
grob <- ggplotGrob(p3) 
object.path <- grid.ls(getGrob(grob, "axis.text.y", grep = TRUE, global = TRUE), print = FALSE)$name 
grob <- grid::editGrob(grob, object.path[1], label = c("ABDQ", "M", "A", "B")) 
grob <- grid::editGrob(grob, object.path[2], label = c("A", "B", "EEEEX")) 
grid.draw(grob) 

もう1つ問題があります。私は自分自身でpanel.marginを設定しなければなりません。そして、私は "global" panel.marginしか設定できないので、これを行うことはできないようです。私が必要とするのは、4面すべてに対して1つです(または少なくとも2)。

質問1:リオーダーを使用する簡単な解決法はありますか?

質問2:scale_x_discreteを使用して必要な軸を取得するソリューションはありますか?

質問3:panel.marginsのビューポートを操作するために必要なグリッドオブジェクトを見つけることができませんでした。適切なグリッドオブジェクトを操作する簡単な方法はありますか?

アイデア?

答えて

3

私はgrid.arrangeはファセットフレームワークに自由なスケールを押し込もしようとするよりも、このためにはるかに優れたツールであることを考える:

library(gridExtra) 
q1 <- ggplot(subset(df,group == 1),aes(x = reorder(fac,val),y = val)) + 
     geom_bar() + 
     facet_wrap(~group) + 
     coord_flip() 

q2 <- q1 %+% subset(df,group == 2) 

grid.arrange(q1,q2,nrow = 1) 

enter image description here

+0

どうもありがとう!私はgrid.arrangeを知らなかった。 – user1901670

関連する問題