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

