首页 文章

将原始数据叠加到geom_bar上

提问于
浏览
4

我的数据框安排如下:

condition,treatment,value
A        ,  one    , 2
A        ,  one    , 1
A        ,  two    , 4
A        ,  two    , 2
...
D        ,  two    , 3

我用ggplot2制作了一个如下所示的分组条形图:
example plot

条形按“条件”分组,颜色表示“处理” . 条形高度是每个条件/处理对的值的平均值 . 我通过创建一个新的数据框来实现这一点,该数据框包含构成每个组的所有点的均值和标准误差(对于误差线) .

我想要做的是叠加原始抖动数据以生成此框图的条形图版本:http://docs.ggplot2.org/0.9.3.1/geom_boxplot-6.png [我意识到盒子图可能会更好,但我的双手被束缚,因为客户端病态附加到栏图]

我已经尝试将geom_point对象添加到我的绘图中并为其提供原始数据(而不是用于制作条形图的聚合方法) . 这种方法有效,但它会在错误的x轴位置绘制原始值 . 它们出现在红色和灰色条连接的点上,而不是在相应条的中心 . 所以我的情节看起来像这样:

wrong-looking plot

我无法弄清楚如何将点移动固定量然后抖动它们以使它们在正确的条上居中 . 谁知道?或许,是否有更好的方法来实现我想要做的事情?

以下是一个显示我遇到的问题的最小示例:

#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)
)

3 回答

  • 2

    您只需要一次调用 geom_point() ,其中您使用数据框 ex 并将 x 值设置为 condy 值为 valuecolor=treataes() 内) . 然后添加 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"))
    

    enter image description here

    更新 - 点的抖动

    您不能直接使用 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”))

    enter image description here

  • 1

    我发现没有必要创建单独的数据帧 . 可以通过向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 example

  • 4

    如上面的holmrenser所示,在geom_bar函数中引用单个数据帧并将stat指令更新为“summary”比创建其他数据帧并在代码中将stat指令保留为“identity”更有效 .

    对于抖动 and 根据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))
    

    enter image description here

相关问题