【问题标题】:Overlay points (and error bars) over bar plot with position_dodge使用 position_dodge 在条形图上叠加点(和误差线)
【发布时间】:2020-04-12 00:27:11
【问题描述】:

我一直在尝试寻找特定问题的答案,但我没有成功,所以我刚刚制作了一个 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()

但我得到了这个:

问题是,每个“科学家”条应该有 3 个“rep”值,但这些值是按“rep”排序的(它们应该是 1、2、3、1、2、3,而不是 1 ,1,2,2,3,3)。

此外,我想用geom_errorbar 添加错误栏,但我没有找到一个可行的例子......

此外,将实际值点叠加到条形图上,这让我想知道这里实际绘制的是什么……是否正确地为每个条形图取值,以及为什么绘制最大值(或看起来如此)默认情况下。

我认为应该正确绘制的方式是使用中值(或平均值),在箱线图中添加像胡须一样的误差线(最小值和最大值)。

知道如何...

  • ...“rep”值点是否以正确的顺序出现?
  • ...将条形显示的值从最大值更改为中值?
  • ...添加带有最大值和最小值的误差线?

【问题讨论】:

  • " 将条形图显示的值从最大值更改为中值" & "添加具有最大值和最小值的误差线" - 只需使用箱线图
  • 我不确定您希望如何显示错误栏。在每个科学家每个时间点的基础上?误差是根据什么统计量计算的? sd? ci?通过三个重复,我会坚持单点和均值/中位数
  • 是的,我想使用箱线图,但是问我这个的人想要那样,我能说什么......我想我会留下点,没有错误酒吧
  • 我需要的只是为每个 Scientist 绘制一个条形图(就像在我的 MWE 中一样),将 3 个不同的点叠加在顶部

标签: r ggplot2 bar-chart point errorbar


【解决方案1】:

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

当您不确定条形图/柱形图中的“绘制在哪里”时,添加选项 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")

【讨论】:

  • 谢谢!我已经完成了箱线图,但有些要求它的人希望它在条形图中......我想我会把误差线排除在外。你的第一个解决方案很接近,但我仍然希望每个科学家一个栏,而不是 3 个。所以一个栏覆盖了 3 个不同的点
  • 所以客户想要一个堆叠的条形图?您在问题中看到的情节实际上是彼此背后的条形图。如果将条形堆叠起来,则 y 轴对数据将变得基本上没有意义。当然,分数不会匹配。至少通过复制来填充颜色,然后 x 轴也显示科学家可能是有意义的。但最后总结百分比并不是那么有意义。我真的建议回到客户那里,询问他们想要展示什么,或者用你想要实现的情节的例子来更新你的问题。
  • 我在答案中添加了另一个情节来说明我的上述评论
  • 是的,最后一部分是我需要的,但最后我只是向他们展示了带有均值的条形图,以及带有标准错误的误差线,详见此处的 R Cookbook -> cookbook-r.com/Graphs/Plotting_means_and_error_bars_(ggplot2)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多