R语言ggplot2绘制iris数值列均值柱形图及标准差误差线
R语言实现iris数据集均值柱状图+标准差线段绘制
需求说明
针对iris数据集,对所有数值列完成以下操作:
- 计算各列均值、标准差
- 将宽格式汇总结果转换为包含
stat(字段名)、mean(均值)、sd(标准差)三列的长格式数据框 - 用ggplot2绘图:柱形展示均值,竖直线段贯穿柱形展示标准差上下界
已有的初步汇总代码
iris %>% dplyr::select_if(is.numeric) %>% dplyr::summarise(avg_sepal_length = mean(Sepal.Length), avg_sepal_width = mean(Sepal.Width), avg_petal_length = mean(Petal.Length), avg_petal_width = mean(Petal.Width), sd_sepal_length = sd(Sepal.Length), sd_sepal_width = sd(Sepal.Width), sd_petal_length = sd(Petal.Length), sd_petal_width = sd(Petal.Width))
目标长数据结构
stat mean sd sepal_length 5.843333 0.8280661 sepal_width 3.057333 0.4358663 petal_length 3.758 1.765298 petal_width 1.199333 0.7622377
注:目标结构示例中pedal_width为笔误,实际字段名为petal_width
实现步骤
1. 数据处理(推荐写法)
不需要手动逐列指定均值、标准差计算,直接通过长表转换+分组汇总一次得到目标结构,代码更简洁易维护:
library(tidyverse) iris_summary <- iris %>% # 提取所有数值列 select(where(is.numeric)) %>% # 宽转长,所有列值存入value列,原列名存入stat列 pivot_longer(cols = everything(), names_to = "stat") %>% # 按字段分组计算均值、标准差 group_by(stat) %>% summarise( mean = mean(value), sd = sd(value), .groups = "drop" ) %>% # 统一stat列命名格式,将列名中的.替换为下划线 mutate(stat = str_replace_all(stat, "\\.", "_"))
如果需要基于已经生成的宽格式汇总表做转换,可以用以下代码:
# 传入已生成的宽表对象即可 iris_summary <- your_wide_summary %>% pivot_longer( cols = everything(), names_to = c(".value", "stat"), names_pattern = "(avg|sd)_(.*)" ) %>% rename(mean = avg)
2. ggplot2绘图
用geom_col绘制均值柱形,geom_segment绘制贯穿柱形的标准差错线段:
ggplot(iris_summary, aes(x = stat, y = mean)) + # 绘制均值柱 geom_col(fill = "#4e79a7", width = 0.6) + # 绘制贯穿柱形的标准差竖线,范围为[mean-sd, mean+sd] geom_segment( aes(x = stat, xend = stat, y = mean - sd, yend = mean + sd), linewidth = 1.2, color = "#e15759" ) + # 以下为可选:给误差线两端加短横帽,可读性更强,不需要可以删掉 geom_segment( aes(x = as.numeric(factor(stat))-0.1, xend = as.numeric(factor(stat))+0.1, y = mean - sd, yend = mean - sd), linewidth = 1.2, color = "#e15759" ) + geom_segment( aes(x = as.numeric(factor(stat))-0.1, xend = as.numeric(factor(stat))+0.1, y = mean + sd, yend = mean + sd), linewidth = 1.2, color = "#e15759" ) + # 标签与主题调整 labs( x = "测量特征", y = "均值", title = "iris数据集数值特征均值与标准差" ) + theme_bw(base_size = 13)
如果不需要误差线两端的短横帽,直接删掉对应两段geom_segment代码即可,剩下的竖直线段就是完全贯穿柱形的标准差展示效果。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

