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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:50:19