如何在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
相关产品推荐
相关产品推荐

