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

R语言绘图:如何填充曲线下方区域?

解决R中曲线下方区域填充问题

你遇到的问题是因为polygon()函数默认会把你传入的点依次连接并闭合,只传曲线的坐标会导致填充的是曲线自身围成的区域,而不是到基线(比如x轴)的下方区域。下面是完整的解决方案,能帮你绘制三条曲线并分别填充它们的下方区域:

步骤1:整理数据

首先把你的数据导入R中(我已经帮你整理成数据框格式):

eb <- data.frame(
  WOL = c(-4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12),
  EB1 = c(-9.61818, -11.75152, -13.01212, -16.16364, -33.8606, -27.897, -25.4242, -23.09697, -21.01212, -18.73333, -16.45455, -16.06667, -15.193939, -14.175758, -12.13939, -11.84848),
  EB2 = c(5.38182, 3.24848, 1.98788, -1.16364, -18.8606, -12.897, -10.4242, -8.09697, -6.01212, -3.73333, -1.45455, -1.06667, -0.193939, 0.824242, 2.86061, 3.15152),
  EB3 = c(15.38182, 13.24848, 11.98788, 8.83636, -8.8606, -2.897, -0.4242, 1.90303, 3.98788, 6.26667, 8.54545, 8.93333, 9.806061, 10.824242, 12.86061, 13.15152)
)

步骤2:绘制基础图并填充区域

我们需要先创建绘图框架,然后为每条曲线构造闭合的多边形坐标(曲线点 + 基线点),这样才能填充曲线到基线的下方区域:

# 创建基础绘图框架,确保包含所有数据的范围
plot(NA, xlim = range(eb$WOL), ylim = range(c(eb$EB1, eb$EB2, eb$EB3)), 
     xlab = "WOL", ylab = "EB Values", main = "Curves with Filled Areas Below")

# 填充EB1曲线下方到y=0的区域(用半透明色避免覆盖曲线)
polygon(c(eb$WOL, rev(eb$WOL)), c(eb$EB1, rep(0, nrow(eb))), 
        col = rgb(1, 0, 0, 0.3), border = NA)

# 填充EB2曲线下方到y=0的区域
polygon(c(eb$WOL, rev(eb$WOL)), c(eb$EB2, rep(0, nrow(eb))), 
        col = rgb(0, 1, 0, 0.3), border = NA)

# 填充EB3曲线下方到y=0的区域
polygon(c(eb$WOL, rev(eb$WOL)), c(eb$EB3, rep(0, nrow(eb))), 
        col = rgb(0, 0, 1, 0.3), border = NA)

步骤3:绘制曲线和图例

最后把三条曲线画在填充区域上方,再添加图例区分:

# 绘制三条曲线
lines(eb$WOL, eb$EB1, col = "red", lwd = 2)
lines(eb$WOL, eb$EB2, col = "green", lwd = 2)
lines(eb$WOL, eb$EB3, col = "blue", lwd = 2)

# 添加图例
legend("bottomleft", legend = c("EB1", "EB2", "EB3"), 
       col = c("red", "green", "blue"), lwd = 2, 
       fill = c(rgb(1,0,0,0.3), rgb(0,1,0,0.3), rgb(0,0,1,0.3)))

关键原理说明

  • polygon(c(eb$WOL, rev(eb$WOL)), c(eb$EBx, rep(0, nrow(eb)))):这里我们把x坐标先按原顺序排列,再反向排列;y坐标先放曲线的y值,再放对应x位置的基线y值(这里用y=0,也就是x轴)。这样构造的坐标会形成一个闭合的区域:从曲线起点→终点→沿x轴回到起点,从而填充曲线下方到x轴的区域。
  • 如果你的“下方”是指到绘图区域的底部(而非y=0),可以把rep(0, nrow(eb))换成rep(par("usr")[3], nrow(eb)),par("usr")[3]会获取当前绘图区域的底部y值。

内容的提问来源于stack exchange,提问作者hn.phuong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:42:53