You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:24:40