You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在ggplot中绘制带标准差误差棒的分组柱状图

解决分组柱状图+误差棒的问题

嘿,我明白你卡在数据整理这一步了!别着急,咱们一步步来搞定这个图。首先你的数据结构里,x/y/z是每个type的观测值,xsd/ysd/zsd是对应变量的标准差(而且每行都重复了,这个没问题,咱们整理的时候会处理)。

第一步:把数据整理成ggplot需要的长格式

之前用gather没成功,大概率是没把均值和标准差列对应好。咱们用更灵活的pivot_longer(tidyr包的新函数,比gather更直观)来拆分数据,分成均值和标准差两部分再合并:

# 先加载需要的包
library(tidyverse)

# 复现你的原始数据(加个随机种子让结果可重复)
set.seed(123)
type <- c("a","b","c","d","e") 
x <- rnorm(5) 
y <- rnorm(5) 
z <- rnorm(5) 
xsd <- sd(x) 
ysd <- sd(y) 
zsd <- sd(z) 
df <- data.frame(type, x,y,z,xsd,ysd,zsd)

# 整理均值数据:把x/y/z转成长格式
mean_df <- df %>%
  select(type, x, y, z) %>%
  pivot_longer(cols = -type, 
               names_to = "variable", 
               values_to = "mean_val")

# 整理标准差数据:把xsd/ysd/zsd转成长格式,去掉末尾的"sd"匹配变量名
sd_df <- df %>%
  select(type, xsd, ysd, zsd) %>%
  pivot_longer(cols = -type, 
               names_to = "variable", 
               values_to = "sd_val") %>%
  mutate(variable = str_remove(variable, "sd")) # 把xsd变成x,匹配mean_df的变量名

# 合并两个数据框(先去重标准差数据,避免重复匹配)
plot_df <- mean_df %>%
  left_join(sd_df %>% distinct(type, variable, sd_val), 
            by = c("type", "variable"))

第二步:用ggplot画分组柱状图+误差棒

现在数据格式对了,咱们来画图:x轴是type,每个type下分x/y/z三个组,y轴是均值,误差棒用对应的标准差:

ggplot(plot_df, aes(x = type, y = mean_val, fill = variable)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) + # 分组柱状图,调整间距让显示更美观
  geom_errorbar(aes(ymin = mean_val - sd_val, ymax = mean_val + sd_val),
                position = position_dodge(width = 0.8), width = 0.2) + # 误差棒和柱子对齐
  labs(title = "分组均值柱状图(带标准差误差棒)",
       x = "Type分组",
       y = "均值",
       fill = "变量") +
  theme_minimal()

为什么之前的gather没成功?

gather是tidyr旧版的函数,它一次只能处理一组列,如果你只转了x/y/z,没同步处理xsd/ysd/zsd,就会导致标准差和均值没法对应。用pivot_longer可以分别处理两组列,再通过变量名匹配合并,就完美解决这个问题啦。

内容的提问来源于stack exchange,提问作者jesusgarciab

火山引擎 最新活动