如何用geom_line绘制多列行均值并通过geom_smooth展示标准差?
解决方法
你的问题核心在于:geom_smooth 默认生成的是拟合模型的置信区间,而非原始数据的标准差范围。要展示行均值对应的标准差,需要先计算每个年份的均值和标准差,再用 geom_ribbon 绘制区间,配合平滑线展示。
修正步骤与代码:
- 将宽格式数据转为长格式,简化分组统计操作
- 按年份分组计算均值、标准差
- 绘制各WUE系列折线 + 均值平滑线 + 标准差区间
library(ggplot2) library(tidyr) library(dplyr) # 1. 转换数据格式:宽转长,把多列WUE数据整合为两列 wue_long <- wue_r %>% pivot_longer(cols = starts_with("WUE"), names_to = "WUE_type", values_to = "WUE_value") # 2. 按年份分组,计算每个年份的WUE均值和标准差 wue_stats <- wue_long %>% group_by(Year) %>% summarise( mean_wue = mean(WUE_value, na.rm = TRUE), sd_wue = sd(WUE_value, na.rm = TRUE) ) # 3. 绘制图形 colors <- c("WUE16"="chartreuse", "WUE19"="chartreuse3", "WUE27"="darkgreen", "WUE17"="darkolivegreen", "均值"="black") plot1 <- ggplot() + # 绘制各WUE系列的原始折线 geom_line(data = wue_long, aes(x = Year, y = WUE_value, color = WUE_type), linewidth = 1.75) + # 绘制均值的平滑线(关闭默认置信区间) geom_smooth(data = wue_stats, aes(x = Year, y = mean_wue, color = "均值"), span = 0.2, linetype = "twodash", linewidth = 2, se = FALSE) + # 绘制标准差区间(均值±标准差),用半透明灰色填充 geom_ribbon(data = wue_stats, aes(x = Year, ymin = mean_wue - sd_wue, ymax = mean_wue + sd_wue), fill = "grey", alpha = 0.3) + labs(color = "Legend") + scale_color_manual(values = colors) print(plot1)
关键说明:
- 用
pivot_longer转长格式后,无需重复编写多条geom_line,代码更简洁易维护 group_by + summarise是计算年份维度统计量的标准方式,确保每个年份的均值和标准差对应正确geom_ribbon是绘制区间范围的专用函数,alpha参数控制填充透明度,避免遮挡下层折线
内容的提问来源于stack exchange,提问作者rubst4r
相关产品推荐
相关产品推荐

