在R语言中使用polygon函数为折线图正负Y值区域填色
用polygon函数实现时间序列正负区域分色填充(非ggplot方案)
你需要给时间序列折线图的Y值正区域填红色、负区域填蓝色,不用ggplot的话,可以通过分别提取正负区间的坐标,调用两次polygon来实现。先看你当前代码的问题:polygon语法有误,且未区分正负区域,所以达不到预期效果。
修正后的完整代码
# 假设ts.NAO和running_mean数据已准备好 x <- ts.NAO$Year y <- ts.NAO$NAO_index # 绘制基础折线图 plot(y, type="l", ann=FALSE, xaxt="n", yaxt="n", xlim=c(0,123)) # 添加滑动平均线(用lines替代par(new=TRUE)更简洁) lines(running_mean, type="l", lty=2, lwd=2, col="red") # 添加标题、坐标轴和参考线 title(xlab="Years", ylab="NAO SLP Index") abline(h=0, col="blue") axis(side=1, at=seq(1,123,10), labels=seq(1900,2020,10), las=1) axis(side=2, at=seq(-6,6,0.5), labels=seq(-6,6,0.5)) # 处理正区域(Y≥0),填充红色 y_pos <- pmax(y, 0) polygon(c(x, rev(x)), c(y_pos, rep(0, length(x))), col="red", border=NA) # 处理负区域(Y≤0),填充蓝色 y_neg <- pmin(y, 0) polygon(c(x, rev(x)), c(y_neg, rep(0, length(x))), col="blue", border=NA) # 重复绘制折线和平均线,避免被填充色覆盖 lines(y, type="l") lines(running_mean, type="l", lty=2, lwd=2, col="red")
关键逻辑说明
pmax(y, 0):把所有Y值小于0的部分替换为0,得到正区域的上边界;配合反转的x轴和全0的下边界,组成闭合多边形后用红色填充。pmin(y, 0):把所有Y值大于0的部分替换为0,得到负区域的下边界;同样配合反转的x轴和全0的上边界,组成闭合多边形后用蓝色填充。- 最后重复绘制折线和平均线,是因为填充色会覆盖底层线条,确保线条显示在最上层。
内容的提问来源于stack exchange,提问作者kettaren ray
相关产品推荐
相关产品推荐

