position_dodge 在条形图上叠加点(和误差线)

Overlay points (and error bars) over bar plot with position_dodge

我一直在努力寻找我的特定问题的答案,但我没有成功,所以我刚刚在这里 post 做了一个 MWE。

我尝试了 here 的答案,但没有成功。

我想做的任务看起来很简单,但我想不通,得到的结果让我有一些基本的问题...

我只想在条形图上叠加点和误差条,使用 ggplot2

我有一个长格式数据框,如下所示:

> mydf <- data.frame(cell=paste0("cell", rep(1:3, each=12)),
   scientist=paste0("scientist", rep(rep(rep(1:2, each=3), 2), 3)),
   timepoint=paste0("time", rep(rep(1:2, each=6), 3)),
   rep=paste0("rep", rep(1:3, 12)),
   value=runif(36)*100)

我试图通过以下方式获得我想要的情节:

myPal <- brewer.pal(3, "Set2")[1:2]
myPal2 <- brewer.pal(3, "Set1")
outfile <- "test.pdf"
pdf(file=outfile, height=10, width=10)
print(#or ggsave()
  ggplot(mydf, aes(cell, value, fill=scientist )) +
  geom_bar(stat="identity", position=position_dodge(.9)) +
  geom_point(aes(cell, color=rep), position=position_dodge(.9), size=5) +
  facet_grid(timepoint~., scales="free_x", space="free_x") +
  scale_y_continuous("% of total cells") +
  scale_fill_manual(values=myPal) +
  scale_color_manual(values=myPal2)
)
dev.off()

但是我得到了这个:

问题是,每个 "scientist" 柱应该有 3 个 "rep" 值,但这些值是按 "rep" 排序的(它们应该是 1,2,3,1 ,2,3,而不是 1,1,2,2,3,3)。

此外,我想用 geom_errorbar 添加错误栏,但我没能得到一个工作示例...

此外,叠加的实际值指向条形图,这让我想知道这里实际绘制的是什么......如果每个条形图的值都正确,以及为什么最大值(或者看起来如此)默认绘制。

我认为应该正确绘制的方法是使用中位数(或均值),在箱线图中添加误差线,例如胡须(最小值和最大值)。

知道如何...

我稍微调整了您的绘图代码,使事情变得更容易。 秘诀是使用适当的分组(否则可以从 fillcolor 中推断出来)。此外,由于您要在多个级别上躲避,因此必须使用 dodge2

当您不确定 bar/column 图表中的 "what is plotted where" 时,添加选项 color="black" 总是有帮助的,因为您的使用 dodge 而不是 dodge2.

p = ggplot(mydf, aes(x=cell, y=value, group=paste(scientist,rep))) +
  geom_col(aes(fill=scientist), position=position_dodge2(.9)) +
  geom_point(aes(cell, color=rep), position=position_dodge2(.9), size=5) +
  facet_grid(timepoint~., scales="free_x", space="free_x") +
  scale_y_continuous("% of total cells") +
  scale_fill_brewer(palette = "Set2")+
  scale_color_brewer(palette = "Set1")

ggsave(filename = outfile, plot=p, height = 10, width = 10)

给出:

关于误差线

因为只有三个重复,我会展示原始数据点,也许还有小提琴图。为了完整起见,我还添加了一个 geom_errorbar.

ggplot(mydf, aes(x=cell, y=value,group=paste(cell,scientist))) +
  geom_violin(aes(fill=scientist),position=position_dodge(),color="black") +
  geom_point(aes(cell, color=rep), position=position_dodge(0.9), size=5) +
  geom_errorbar(stat="summary",position=position_dodge())+
  facet_grid(timepoint~., scales="free_x", space="free_x") +
  scale_y_continuous("% of total cells") +
  scale_fill_brewer(palette = "Set2")+
  scale_color_brewer(palette = "Set1")

给予

评论后更新

正如我在下面的评论中提到的,百分比的叠加会导致不良结果。

ggplot(mydf, aes(x=paste(cell, scientist), y=value)) +
  geom_bar(aes(fill=rep),stat="identity", position=position_stack(),color="black") +
  geom_point(aes(color=rep), position=position_dodge(.9), size=3) +
  facet_grid(timepoint~., scales="free_x", space="free_x") +
  scale_y_continuous("% of total cells") +
  scale_fill_brewer(palette = "Set2")+
  scale_color_brewer(palette = "Set1")