ggplot2 并排绘制变量的均值和标准差

Posted

技术标签:

【中文标题】ggplot2 并排绘制变量的均值和标准差【英文标题】:ggplot2 to plot mean and sd of a variable side by side 【发布时间】:2019-07-24 23:00:56 【问题描述】:

我正在尝试为 R 中的两个不同组创建变量的均值和 sd(并排)图,以获得类似的结果。

蓝色条是平均值,橙色条是 SD。

为此,我使用 R 中的 ggplot2 包。 如果我分别使用这些代码

ggplot(data, aes(x=factor(grouping variable), y=my variable)) + stat_summary(fun.y="mean", geom="bar", col="blue")

ggplot(data, aes(x=factor(grouping variable), y=my variable)) + stat_summary(fun.y="sd", geom="bar", col="orange")

它们运行良好,但在两个不同的图表中产生均值和标准差。

所以我尝试使用

将它们组合在一个图表中
stat = "summary", fun.y = "mean" and stat = "summary", fun.y = "sd"

我得到了什么

ggplot(data, aes(x=factor(grouping variable)) + geom_bar(aes(y=my variable), stat = "summary", fun.y = "mean", position="dodge",col="blue") + geom_bar(aes(y=my variable), stat = "summary", fun.y = "sd", position="dodge",col="orange")

出现如下错误

错误:出现意外符号: "ggplot(data, aes(x=factor(grouping variable)) + geom_bar(aes(y=my variable), stat = "summary", fun.y = "mean", position="dodge",col="blue ") + geom_bar(aes(y=我的变量), stat = "summary", fun.y = "sd", positi ggplot"

您能帮忙解决这个错误吗?或者有其他方法可以解决这个问题吗?

更新信息: 我的数据样本看起来像 enter image description here

我在这些数据上运行以下代码来绘制两位面试官的均值 tTTO 和 sd tTTO:

ggplot(timeTTO, aes(x=interviewer, y=tTTO)) + 
  theme_light() + 
  labs(title = "Figure 3. Time taken to complete a single TTO task, by interviewer", x=NULL, y=NULL) + 
  theme(plot.title = element_text(face = "bold")) + 
  geom_bar(stat = "summary", fun.y = "mean",width=0.25, fill = "blue") + 
  geom_bar(stat = "summary", fun.y = "sd", width=0.25,fill = "orange") 

我得到了这样的东西,蓝色条是手段,橙色条是 SD: enter image description here

其实我试过用 position="dodge" 把它放在两个 geom_bar() 函数中,还是不行

【问题讨论】:

其实已经用这个代码修复了 ggplot(data, aes(x=grouping variable, y=my variable)) + geom_bar(stat = "summary", fun.y = "mean",宽度=0.25,填充=“蓝色”,col=“蓝色”)+ geom_bar(stat=“摘要”,fun.y=“sd”,宽度=0.25,填充=“橙色”,col=“橙色”)但是仍然需要帮助将它们并排绘制,因为现在它们相互重叠。谢谢! 【参考方案1】:

似乎position="dodge" 用于相同 x 的 geom,但不适用于 stat。我想出了两个解决方案。

首先,我保留了您的 stat_summary 并使用 position_nudge 手动将条形图放置在您指定的位置。请注意图例也不起作用,因为没有实际的绘图数据,只有统计图层。

第二个,我在ggplot之前做了数据分析,用group_by,summary,然后gather,把数据做长。然后我们可以使用常规的geom_col,因为数据已经被处理了。

library(tidyverse)
tibble(interviewer = c("i2", "i1", "i1", "i2", "i1"), tTTO = c(245, 251, 99, 85, 101)) %>%
  ggplot(aes(x=interviewer, y=tTTO)) + 
  theme_light() + 
  labs(title = "Figure 3. Time taken to complete a single TTO task, by interviewer", x=NULL, y=NULL) + 
  theme(plot.title = element_text(face = "bold"), legend.position = "bottom") + 
  geom_bar(stat = "summary", fun.y = "mean", position = position_nudge(x = -0.125, y = 0), width = 0.25, fill = "blue") + 
  geom_bar(stat = "summary", fun.y = "sd", position = position_nudge(x = 0.125, y = 0), width = 0.25, fill = "orange")

  # Notice that the legend does not work for stat geoms

tibble(interviewer = c("i2", "i1", "i1", "i2", "i1"), tTTO = c(245, 251, 99, 85, 101)) %>%
  group_by(interviewer) %>%
  summarize(mean(tTTO), sd(tTTO)) %>%
  gather(key = "type", value = "value", 2:3) %>%
  ggplot(aes(x=interviewer, y=value, fill=type)) + 
  theme_light() + 
  labs(title = "Figure 3. Time taken to complete a single TTO task, by interviewer", x=NULL, y=NULL) + 
  theme(plot.title = element_text(face = "bold"), legend.position = "bottom") + 
  geom_col(position = "dodge", width = 0.25) +
  scale_fill_manual(values = c("blue","orange"))

由reprex package (v0.2.1) 于 2019 年 3 月 4 日创建

【讨论】:

亲爱的亚瑟,我添加了我的数据样本和有效的代码,实际上,我尝试了 position="dodge",它没有工作,条形仍然重叠。谢谢!

以上是关于ggplot2 并排绘制变量的均值和标准差的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制一个只有一个变量的平均值和标准差

用均值条形图及其标准差 ggplot2 总结数据框

计算多个变量的一个均值和标准差

R语言使用ggplot2包的快速可视化函数qplot绘制散点图(添加平滑曲线与标准差带)实战

如何将大批量数据进行标准差标准化

R中具有多个分组因子的多个变量的均值和标准差