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

如果我在这里错了,哈德利无疑会纠正我......

这是自然语法:

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 *宽度/n,最后一点是闪避n *宽度/n。

这显然不是你的意思,虽然这是你的。您可能会被困在手动重新创建闪避的箱线图,或者使用不同的可视化,比如刻面?

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