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

R绘图:为x轴分区添加均值与标准误的技术求助

解决方案:为区间添加均值与标准误阴影效果

没问题,咱们可以通过分组计算统计量 + 绘制阴影与均值线的方式来实现你的需求。下面是完整的可运行代码,以及关键步骤的解释:

1. 数据预处理:给年份划分区间

首先我们需要给数据中的Year列添加分组标签,对应你用竖线划分的四个区间:1970-1993、1994-2004、2005-2009、2010-2016:

# 加载你的数据
data <- structure(list(Year = c(1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016), Tot = c(52, 46, 19, 52, 94, 102, 104, 143, 117, 146, 135, 132, 152, 134, 138, 141, 134, 134, 134, 145, 152, 126, 139, 138, 97, 120, 97, 98, 76, 84, 102, 98, 99, 96, 96, 98, 102, 102, 107, 109, 109, 107, 112, 107, 93, 114, 108)), row.names = c(NA, -47L), class = c("tbl_df", "tbl", "data.frame"))

# 添加区间分组
data$group <- cut(data$Year, 
                  breaks = c(1969, 1994, 2005, 2010, 2017),  # 用1969/2017确保包含首尾年份
                  labels = c("1970-1993", "1994-2004", "2005-2009", "2010-2016"))

2. 计算每个区间的均值与标准误

接下来用aggregate函数按分组计算Tot的均值和标准误(标准误=标准差/样本量平方根):

# 分组统计均值和标准误
summary_stats <- aggregate(Tot ~ group, data = data, 
                          FUN = function(x) {
                            mean_val <- mean(x)
                            se_val <- sd(x)/sqrt(length(x))
                            data.frame(mean = mean_val, se = se_val)
                          })

# 展开嵌套的数据框,方便后续绘图
summary_stats <- do.call(data.frame, summary_stats)

# 给每个区间添加x轴的起始/结束年份
summary_stats$x_start <- c(1970, 1994, 2005, 2010)
summary_stats$x_end <- c(1993, 2004, 2009, 2016)

3. 绘制带均值与标准误阴影的图形

保留你原来的绘图代码,然后通过polygon绘制半透明的标准误阴影,用lines绘制均值线:

# 原始折线散点图
plot(data$Year, data$Tot, type="b", xlab="", ylab="", ylim=c(0,200),
     lty="solid", lwd=2, col='black', cex.lab=1.5, las=1, cex=1.5)

# 添加区间划分竖线
abline(v=1994, col="grey", lty="dotted", lwd=3)
abline(v=2005, col="grey", lty="dotted", lwd=3)
abline(v=2010, col="grey", lty="dotted", lwd=3)

# 循环绘制每个区间的标准误阴影和均值线
for(i in 1:nrow(summary_stats)){
  # 绘制半透明的标准误阴影
  polygon(
    x = c(summary_stats$x_start[i], summary_stats$x_end[i], 
          summary_stats$x_end[i], summary_stats$x_start[i]),
    y = c(summary_stats$mean[i] - summary_stats$se[i], 
          summary_stats$mean[i] - summary_stats$se[i],
          summary_stats$mean[i] + summary_stats$se[i], 
          summary_stats$mean[i] + summary_stats$se[i]),
    col = adjustcolor("grey", alpha.f = 0.3),  # 半透明灰色,避免遮挡原始数据
    border = NA  # 去掉阴影边框
  )
  
  # 绘制红色均值线(突出显示)
  lines(
    x = c(summary_stats$x_start[i], summary_stats$x_end[i]),
    y = rep(summary_stats$mean[i], 2),
    col = "red", lwd=2
  )
}

关键细节说明

  • polygon函数通过四个坐标点绘制矩形阴影,覆盖整个区间的x范围,y范围是均值±标准误
  • adjustcolor设置阴影的透明度(alpha.f=0.3),既显示阴影效果,又不会挡住原始的折线和散点
  • 均值线用红色粗线绘制,和原始数据形成对比,更易识别

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:12:58