[英]Overlay raw data onto geom_bar
我有一个数据框排列如下:
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)
)
我发现没有必要创建单独的数据框。 可以通过向 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))
您只需要调用geom_point()
,在其中使用数据框ex
并将x
值设置为cond
,将y
值设置为value
和color=treat
(在aes()
)。 然后添加position=dodge
以确保点被躲避。 使用scale_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"))
您不能直接同时使用位置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)
现在在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"))
如上面的 holmrenser 所示,在 geom_bar 函数中引用单个数据帧并将 stat 指令更新为“摘要”比创建额外的数据帧并在代码中将 stat 指令保留为“身份”更有效。
为了根据 OP 的原始问题使用条形图抖动和躲避数据点,这也可以通过使用 position_jitterdodge 更新代码中的位置指令来实现。 这种定位方案允许独立定制抖动和闪避项的宽度,如下所示:
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_jitterdodge(jitter.width = 0.5, jitter.height=0.4,
dodge.width=0.9))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.