我有一个数据框架,安排如下:
condition,treatment,value
A , one , 2
A , one , 1
A , two , 4
A , two , 2
...
D , two , 3
Run Code Online (Sandbox Code Playgroud)
我已经使用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)
)
Run Code Online (Sandbox Code Playgroud)
我发现没有必要创建单独的数据框。可以通过向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))
Run Code Online (Sandbox Code Playgroud)
您只需要对geom_point()使用数据框的位置进行一次调用ex,并将x值设置为 、cond和(内部)。然后加点以保证闪避。通过和 参数,您可以设置您需要的颜色。yvaluecolor=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"))
Run Code Online (Sandbox Code Playgroud)

您不能直接将位置dodge和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)
Run Code Online (Sandbox Code Playgroud)
现在geom_point()使用这个新列作为x值并将位置设置为jitter。
ex$xcord<-rep(c(0.775,1.225,1.775,2.225,2.775,3.225,3.775,4.225),each=4)
Run Code Online (Sandbox Code Playgroud)
