6

我有一个排列如下的数据框:

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

3 回答 3

6

我发现没有必要创建单独的数据框。可以通过向 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 示例

于 2017-01-27T12:49:48.353 回答
2

您只需调用一次即可geom_point()使用数据框ex并将x值设置为、cond和( inside )。然后添加以确保点是躲闪的。使用和参数,您可以设置所需的颜色。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"))

在此处输入图像描述

更新 - 点的抖动

您不能直接将位置dodgejitter一起使用。但是有一些解决方法。如果您将整个图保存为对象,那么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"))

在此处输入图像描述

于 2013-05-24T14:12:45.947 回答
2

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

为了根据 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))

在此处输入图像描述

于 2017-09-13T14:55:20.190 回答