2

ggplot2では、棒グラフまたはクロスバープロットの変数と因子内の複数の位置回避を制御したいと思います。例えば:

data = data.frame(Var=c("a","a","a","a","b","b","b","b"),
                Val=c(0.5,0.4,0.1,0.0,-0.1,-0.3,-0.0,0.1),
                g1=c(1,2,3,4,5,6,7,8),
                g2=c(1,2,3,4,1,2,3,4),
                g3=c(1,2,1,2,1,2,1,2))

q = ggplot(data,aes(Var,Val,ymin = Val-0.15,
                    ymax=Val+0.15,
                    group=g1,
                    colour=factor(g2),
                    fill=factor(g2),
                    linetype=factor(g3),))
q + geom_crossbar(width=0.5,fatten=2,size=0.5,position=position_dodge(width=0.51)) + 
    coord_flip() +  
    theme_bw() + 
    scale_fill_manual(values=c("#00000090","#00000090","#00000050","#00000050")) + 
    scale_colour_manual(values=c("#000000","#00000070","#000000","#00000070"))

上記の例では、各バーを一緒に設定したまま、暗いバーと明るいバーをわずかに分離できるようにしたいと思います。これを達成するために複数の位置回避を実装できますか?どんな助けでもいただければ幸いです。

4

2 に答える 2

3

あなたが望むネストされた覆い焼きをシミュレートするために使用することを提案しfacet_gridます。g4そのために、明るい灰色と暗い灰色のバーをグループ化する新しい因子を作成しました。

library(ggplot2)

dat = data.frame(Var=c("a","a","a","a","b","b","b","b"),
                Val=c(0.5,0.4,0.1,0.0,-0.1,-0.3,-0.0,0.1),
                g1=c(1,2,3,4,5,6,7,8),
                g2=c(1,2,3,4,1,2,3,4),
                g3=c(1,2,1,2,1,2,1,2))

dat$g4 = c(1, 1, 2, 2, 1, 1, 2, 2) # New grouping factor

fill_values   = c("#00000090","#00000090","#00000050","#00000050")
colour_values = c("#000000","#00000070","#000000","#00000070")

#---------------------------------------------------------------------------
fig1 = ggplot(dat, aes(x=Var, y=Val, ymin=Val - 0.15, ymax=Val + 0.15, 
              colour=factor(g2), fill=factor(g2), linetype=factor(g3))) +
    geom_crossbar(width=0.5, fatten=2, size=0.5,
                  position=position_dodge(width=0.51)) +
    coord_flip() + 
    theme_bw() +
    scale_fill_manual(values=fill_values) +
    scale_colour_manual(values=colour_values) +
    opts(title="Figure 1: Original Version")

png("fig1.png", height=600, width=600)
print(fig1)
dev.off()

#---------------------------------------------------------------------------
fig2 = ggplot(dat, aes(x=factor(g4), y=Val, ymin=Val - 0.15,ymax=Val + 0.15, 
              colour=factor(g2), fill=factor(g2), linetype=factor(g3))) +
    geom_crossbar(width=0.7, fatten=2, size=0.5,
                  position=position_dodge()) +
    coord_flip() + 
    theme_bw() +
    scale_fill_manual(values=fill_values) +
    scale_colour_manual(values=colour_values) +
    facet_grid(Var ~ .) +
    opts(title="Figure 2: Proposed Solution")

png("fig2.png", height=600, width=600)
print(fig2)
dev.off()

図1 図 2

于 2012-06-21T00:35:50.840 に答える
3

更新されたコードとプロット

これは、1 つのパネルでライト グレーとダーク グレーを分離するアプローチです。geom_crossbarへの 2 回の呼び出しで、明るい灰色のコルスバーが最初の呼び出しに配置され、次に暗い灰色のクロスバーが 2 番目の呼び出しに配置されるように、データをサブセット化する必要があります。データのサブセット化を可能にするために、別のグループ化変数をデータ フレームに追加しました。

library(ggplot2)
data = data.frame(Var=c("a","a","a","a","b","b","b","b"),
                Val=c(0.5,0.4,0.1,0.0,-0.1,-0.3,-0.0,0.1),
                g1=c(1,2,3,4,5,6,7,8),
                g2=c(1,2,3,4,1,2,3,4),
                g3=c(1,2,1,2,1,2,1,2))
data$g4 = c(1,1,2,2,1,1,2,2)

q = ggplot(data, aes(Var,Val,ymin = Val-0.15,
    ymax=Val+0.15, group=g1, colour=factor(g2),
    fill=factor(g2), linetype=factor(g3)))

# Position the light grey crossbars
q = q + geom_crossbar(data = subset(data, data$g4 == 1), 
        aes(as.numeric(Var) - .12, Val, ymin = Val-0.15, ymax = Val + 0.15), 
        width = 0.2, fatten = 1.25, size = 0.65, position = position_dodge(width = 0.2))

library(grid)
# position the dark grey crossbars, and tidy up
q + geom_crossbar(data = subset(data, data$g4 == 2), 
        aes(as.numeric(Var) + .12, Val, ymin = Val-0.15, ymax = Val + 0.15), 
        width = 0.2, fatten = 1.25, size = 0.65, position = position_dodge(width = 0.2)) + 
    scale_x_continuous(breaks = c(1, 2), labels = c("a", "b"), expand = c(.2, 0)) +
    scale_fill_manual(values = c("#00000057", "#00000057", "#00000020", "#00000020")) + 
    scale_colour_manual(values = c("#000000", "#00000070", "#000000", "#00000070")) +
    coord_flip() +  theme_bw() +
   theme(legend.key.size = unit(1.5, "cm"))

ここに画像の説明を入力

于 2012-06-21T21:26:59.440 に答える