6

次のように配置されたデータフレームがあります。

condition,treatment,value
A        ,  one    , 2
A        ,  one    , 1
A        ,  two    , 4
A        ,  two    , 2
...
D        ,  two    , 3

ggplot2 を使用して、次のようなグループ化された棒グラフを作成しました。 プロット例

バーは「状態」ごとにグループ化され、色は「治療」を示します。バーの高さは、各条件/治療ペアの値の平均です。これは、各グループを構成するすべてのポイントの平均と標準誤差 (エラー バーの) を含む新しいデータ フレームを作成することで実現しました。

私がやりたいのは、生のジッターデータを重ね合わせて、この箱ひげ図の棒グラフ バージョンを生成することです: http://docs.ggplot2.org/0.9.3.1/geom_boxplot-6.pngおそらくもっと良いでしょうが、クライアントが病的に棒グラフに執着しているため、私の手は縛られています]

geom_point オブジェクトをプロットに追加して、生データ (バーを作成するために使用された集計平均ではなく) をフィードしようとしました。この種の方法は機能しますが、生の値が間違った x 軸の位置にプロットされます。それらは、適切なバーの中心ではなく、赤と灰色のバーが結合するポイントに表示されます。したがって、私のプロットは次のようになります。

間違ったプロット

ポイントを一定量シフトしてから、正しいバーの中央に配置するためにジッターする方法がわかりません。誰でも知っていますか?おそらく、私がやろうとしていることを達成するためのより良い方法はありますか?

以下は、私が抱えている問題を示す最小限の例です。

#Make some fake data
ex=data.frame(cond=rep(c('a','b','c','d'),each=8),
    treat=rep(rep(c('one','two'),4),each=4),
    value=rnorm(32) + rep(c(3,1,4,2),each=4) )

#Calculate the mean and SD of each condition/treatment pair
agg=aggregate(value~cond*treat, data=ex, FUN="mean") #mean
agg$sd=aggregate(value~cond*treat, data=ex, FUN="sd")$value #add the SD 


dodge <- position_dodge(width=0.9) 
limits <- aes(ymax=value+sd, ymin=value-sd) #Set up the error bars

p <- ggplot(agg, aes(fill=treat, y=value, x=cond)) 

#Plot, attempting to overlay the raw data
print(
       p + geom_bar(position=dodge, stat="identity") +
       geom_errorbar(limits, position=dodge, width=0.25) + 
       geom_point(data= ex[ex$treat=='one',], colour="green", size=3) +
       geom_point(data= ex[ex$treat=='two',], colour="pink", size=3)
)
4

3 に答える 3

6

個別のデータフレームを作成する必要がないことがわかりました。プロットは、ggplot に生データを提供することで作成できます。

ex <- data.frame(cond=rep(c('a','b','c','d'),each=8),
              treat=rep(rep(c('one','two'),4),each=4),
              value=rnorm(32) + rep(c(3,1,4,2),each=4) )

p <- ggplot(ex, aes(cond,value,fill = treat))
p + geom_bar(position = 'dodge', stat = 'summary', fun.y = 'mean') +
  geom_errorbar(stat = 'summary', position = 'dodge', width = 0.9) +
  geom_point(aes(x = cond), shape = 21, position = position_dodge(width = 1))

ggplot の例

于 2017-01-27T12:49:48.353 に答える
2

geom_point()データ フレームを使用し、値を に、値を および (内部) に設定する場所を1回呼び出すだけでex済みます。次に、ポイントが確実にかわすように追加します。と引数を使用すると、必要な色を設定できます。xcondyvaluecolor=treataes()position=dodgescale_color_manual()values=

    p+geom_bar(position=dodge, stat="identity") +
      geom_errorbar(limits, position=dodge, width=0.25)+
      geom_point(data=ex,aes(cond,value,color=treat),position=dodge)+
      scale_color_manual(values=c("green","pink"))

ここに画像の説明を入力

更新 - ポイントのジッター

dodgepositionと をjitter一緒に直接使用することはできません。しかし、いくつかの回避策があります。プロット全体をオブジェクトとして保存するとggplot_build()、バーの x 位置が表示されます。この場合、それらの位置は 0.775、1.225、1.775 です... これらの位置は、要因condとの組み合わせに対応しtreatます。データ フレームと同様に、ex組み合わせごとに 4 つの値があり、4 回繰り返される x 位置を含む新しい列を追加します。

ex$xcord<-rep(c(0.775,1.225,1.775,2.225,2.775,3.225,3.775,4.225),each=4)

geom_point()この新しい列をx値として使用し、位置を に設定しますjitter

p+geom_bar(position=dodge, stat="identity") +
  geom_errorbar(limits, position=dodge, width=0.25)+
  geom_point(data=ex,aes(xcord,value,color=treat),position=position_jitter(width =.15))+
  scale_color_manual(values=c("green","pink"))

ここに画像の説明を入力

于 2013-05-24T14:12:45.947 に答える