2017-03-12 10 views
1

をSDにポイントは、私は、次のようなプロットを構築したいと思います:ggplot2:平均表現するために、個々の観察やバーを表し、

個々の観察は点として表現される

enter image description here

、それぞれの平均グループは線分として表され、2つの他の線分は平均+/- sdを示す。上記のプロットは、geom_crossbarを使ってセグメントを描画するコードを使って生成することができました。しかし、これはハックのように感じます。私はggplot2を新しくしています。私が望むものを達成するためのより良い方法があるのだろうかと思います。

library(ggplot2); library(dplyr) 
theme_set(theme_bw(base_size=12, base_family="Helvetica")) 

dat = data.frame(y=rnorm(10), treat=rep(c("A", "B"), each=5)) 
summData = dat %>% group_by(treat) %>% summarize(mean_y=mean(y), sd_y=sd(y)) 
summData$lower = summData$mean_y-summData$sd_y 
summData$upper = summData$mean_y+summData$sd_y 

mBarWidth = 0.5; sdBarWidth = 0.3 
mBarSize = 2; sdBarSize = 0.8 
barColor = adjustcolor("grey10", alpha.f=0.4) 

p = ggplot() 
p = p + geom_point(data=dat, aes(x=treat, y=y), color="skyblue") 
p = p + geom_crossbar(data=summData, aes(x=treat, y=lower, ymin=lower, ymax=lower), width=sdBarWidth, color=barColor, fatten=1, size=sdBarSize) 
p = p + geom_crossbar(data=summData, aes(x=treat, y=mean_y, ymin=mean_y, ymax=mean_y), width=mBarWidth, color=barColor, fatten=1, size=mBarSize) 
p = p + geom_crossbar(data=summData, aes(x=treat, y=upper, ymin=upper, ymax=upper), width=sdBarWidth, color=barColor, fatten=1, size=sdBarSize) 
p = p + xlab("Treatment") + ylab("Response") 

答えて

1

あなたは垂直エラーバーのラインをしたくない場合は、私は例

p = p + geom_point(data=summData, aes(x=treat, y=mean_y), colour=barColor, size=3, shape=21, stroke=1, fill="white") 
+0

おかげで、しかし、セグメントがポイントの代わりに平均を示すようにしたいと思います。また、平均+/- sdを示す上下のバーが垂直線で接続されていないことを望みます。 – sam81

3

次のように白丸として平均値をプロットしggplot2

p = p + geom_errorbar(data=summData, aes(x=treat, ymin=lower, ymax=upper), width=sdBarWidth, color=barColor) 

にgeom_errorbarであり内蔵されていますstat_summaryを使用して要約統計量を計算することができますが、プロットマーカーとしてUnicode emダッシュ文字を持つ点geomを使用します。

は、例えば、以下のコードでは、我々は、平均を計算し、及びstat_summaryに2回目の呼び出しに(ポイントマーカーとして大きな全角ダッシュを使用して)、青線分としてプロットするstat_summaryへの1つの呼び出しを使用します+/- 1sdマーカーの位置を計算し、それらを赤い線分としてプロットします(もう一度大きなemダッシュを使用して)。 "\U2014"はemダッシュのUnicodeコードです。

set.seed(1) 
dat = data.frame(y=rnorm(10), treat=rep(c("A", "B"), each=5)) 

ggplot(dat, aes(treat, y)) + 
    geom_point(color="skyblue") + 
    stat_summary(fun.y=mean, geom="point", shape="\U2014", size=9, colour="blue") + 
    stat_summary(fun.y=function(d) {mean(d) + sd(d)*c(-1,1)}, geom="point", shape="\U2014", 
       size=7, colour="red") 

enter image description here

あなたが実際にstat_summaryに一度のコールで逃げることができますが、それは、ポイントマーカーのサイズと色を指定するには、もう少し作業が必要:私は、具体的

ggplot(dat, aes(treat, y)) + 
    geom_point(color="skyblue") + 
    stat_summary(fun.y=function(d) {mean(d) + sd(d)*c(-1,0,1)}, geom="point", shape="\U2014", 
       size=rep(c(7,9,7),2), colour=rep(c("red","blue","red"), 2)) 
+0

クール。決してそれを考えなかった。 – Feng

+0

ありがとう、私は仕事をしているので、これをupvotingですが、geom_crossbarソリューションのように、それはハックのように少し感じる、例えば、私は独立して長さからセグメントの幅を制御する方法が表示されません ' size 'パラメータを使用し、場合によってはそれを行う必要があります。私は、 "正しい"解決策が、私が望むものを正確に行う新しいカスタム・ギモムを構築することであると感じていますが、それを実行するのに十分なだけのggplot2はわかりません。 – sam81

関連する問題