9

私が達成しようとしているのは、パネルごとに特定の変数でバーを並べることです。

簡単な例:

    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)

しかし、別の問題があります。私は自分で panel.margin を設定する必要がありますが、「グローバル」な panel.margin しか設定できず、必要なのは 4 つの側面 (または少なくとも 2)。

質問 1: 並べ替えを使用した簡単な解決策はありますか?

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

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

何か案は?

4

1 に答える 1

4

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)

ここに画像の説明を入力してください

于 2012-12-13T17:31:47.990 に答える