6

次のデータセットがあるとします。

trt <- ifelse(runif(100)<0.5,"drug","placebo")
inj.site <- ifelse(runif(100)<0.5,"ankle","wrist")
relief <- 20 + 0.5*(inj.site=="ankle") + 0.5*(trt=="drug") + rnorm(100)
to.analyze <- data.frame(trt,inj.site,relief)

ここで、x 軸に損傷部位を、治療ごとのボックスを並べて箱ひげ図を作成します。

bplot <- ggplot(to.analyze,aes(inj.site,relief,fill=trt)) + geom_boxplot(position="dodge")

簡単です。しかし今、ボックスの上に生データ ポイントを追加したいと考えています。のボックスがなかった場合position="dodge"、これは簡単です。

bplot + geom_point(aes(colour=trt))

ただし、これはボックス間にポイントを描画し、position="dodge"このジオメトリに a を追加しても機能しないようです。ポイントがボックス上に描画されるようにこれを調整するにはどうすればよいですか?

ボーナス: を使用stat_summary(blah,y.fun=mean,shape="+")して平均をオーバープロットするのと同じ状況で、同じ問題があります。

4

1 に答える 1

3

ここで私が間違っていれば、Hadley は間違いなく私を訂正してくれるでしょう...

自然な構文は次のとおりです。

bplot + geom_point(aes(colour=trt), position=position_dodge(width=.5))

(position="dodge" は、パラメーターなしで同じことを行います。)

それをプロットすると、position_jitter() のようなものが得られます。これは、おそらくあなたも得られるものです。

興味深いことに、ソースを調べてみると、pos_dodge() 関数が見つかりました。(それを見るには R プロンプトでpos_dodgeとタイプしてください...) これで終わりです:

within(df, {
  xmin <- xmin + width / n * (seq_len(n) - 1) - diff * (n - 1) / (2 * n)
  xmax <- xmin + d_width / n
  x <- (xmin + xmax) / 2
})

n はデータ フレームの行数です。したがって、行でインデックス付けされた分数で個々のポイントをかわしているように見えます! したがって、最初のポイントは幅/n で覆い、2 番目のポイントは 2 * 幅/n で覆い、最後のポイントは n * 幅/n で覆います。

これはあなたが言ったことではありますが、明らかにあなたが意図したものではありません。回避された箱ひげ図を手動で再作成するか、ファセットなどの別の視覚化を使用して立ち往生している可能性がありますか?

ggplot(to.analyze,aes(inj.site,relief)) + geom_boxplot() + facet_wrap(~ trt)
于 2009-09-27T21:48:27.840 に答える