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

如何在R中用ggplot从指定数据框绘制带标准差阴影的折线图

解决方案:用ggplot2绘制带阴影误差区间的折线图

完全可以实现这个需求,核心是先将长格式数据转换为宽格式,让每个日期对应的平均值和标准差成为独立列,再通过geom_ribbon绘制阴影误差区间,叠加geom_line绘制平均值折线。以下是修改后的完整代码:

library(ggplot2)
library(tidyr)

# 原始数据
df = data.frame (Date=c("2020-01-10","2020-01-10","2020-01-10","2020-01-10" 
                        ,"2020-01-11","2020-01-11","2020-01-11","2020-01-11",
                        "2020-01-12","2020-01-12","2020-01-12","2020-01-12" 
                        ,"2020-01-13","2020-01-13","2020-01-13","2020-01-13"), 
                 Category=c("avg_fc","avg_la","sd_fc","sd_la","avg_fc","avg_la","sd_fc","sd_la","avg_fc",
                            "avg_la","sd_fc","sd_la","avg_fc","avg_la","sd_fc","sd_la"), 
                 Value=c(25.5,40.5, 8.1,4.3, 29.5 ,31.5,5.6,9.1,  20.5,43.5, 4.1,8.3, 35.5 ,38.5,2.6,3.1))

# 改造后的绘图函数
generate_chart <- function(data, x_col, title) {
  # 长格式转宽格式,计算误差区间上下限
  data_wide <- data %>%
    pivot_wider(names_from = Category, values_from = Value) %>%
    mutate(
      fc_low = avg_fc - sd_fc,
      fc_high = avg_fc + sd_fc,
      la_low = avg_la - sd_la,
      la_high = avg_la + sd_la,
      {{x_col}} := as.Date({{x_col}})  # 转换为日期类型,保证X轴排序正确
    )
  
  ggplot(data_wide) +
    # 绘制fc组的阴影误差区间
    geom_ribbon(aes(x = {{x_col}}, ymin = fc_low, ymax = fc_high), fill = "#1f77b4", alpha = 0.2) +
    # 绘制la组的阴影误差区间
    geom_ribbon(aes(x = {{x_col}}, ymin = la_low, ymax = la_high), fill = "#ff7f0e", alpha = 0.2) +
    # 绘制fc组平均值折线
    geom_line(aes(x = {{x_col}}, y = avg_fc, color = "avg_fc"), linewidth = 1) +
    # 绘制la组平均值折线
    geom_line(aes(x = {{x_col}}, y = avg_la, color = "avg_la"), linewidth = 1) +
    # 统一颜色映射,确保折线与对应阴影色调一致
    scale_color_manual(values = c("avg_fc" = "#1f77b4", "avg_la" = "#ff7f0e")) +
    # 设置标签
    labs(color = "类别", x = "日期", y = "数值", title = title) +
    theme_light()
}

# 生成并显示图表
plt_mm <- generate_chart(
  data = df,
  x_col = Date,
  title = "Money Chart"
)

print(plt_mm)

关键说明:

  • 数据格式转换:用pivot_wider将长数据转为宽数据,让每个日期对应avg_fc/avg_la(平均值)和sd_fc/sd_la(标准差)四个字段;
  • 误差区间计算:通过mutate生成每个平均值对应的上下边界(平均值±标准差);
  • 图层顺序:先绘制geom_ribbon阴影区间,再叠加geom_line折线,确保折线在最上层;
  • 视觉一致性:为每组的折线和阴影设置同色系,用alpha调整阴影透明度,避免遮挡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:44:58