繁体   English   中英

将原始数据叠加到 geom_bar 上

[英]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))

ggplot 示例

您只需要调用geom_point() ,在其中使用数据框ex并将x值设置为cond ,将y值设置为valuecolor=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"))

在此处输入图片说明

更新 - 点的抖动

您不能直接同时使用位置dodgejitter 但是有一些解决方法。 如果保存整个情节的对象,然后用ggplot_build()你可以看到酒吧X位置-在这种情况下,他们是0.775,1.225,1.775 ......那些位置对应于因子的组合condtreat 在数据框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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM