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

如何用ggplot为端点与测量间隔不同的两条曲线填充区域?

解决不同间隔横断面曲线间区域高亮问题的思路

因为两组数据的测量点(Distance)不重合,geom_ribbon无法直接匹配对应x值的上下边界,核心解决方向是对齐两组数据的x轴,让每个x位置都有对应的两个场景深度值,具体步骤如下:

1. 把长格式数据转成宽格式

先将数据重构为宽格式,方便后续处理每个场景的深度值:

library(tidyr)
data_wide <- data %>% 
  pivot_wider(names_from = Scenario, values_from = Depth)

2. 插值补全,对齐x轴

生成覆盖两组数据全部范围的连续x序列,然后分别对两个场景的深度值做线性插值,确保每个x位置都有对应的深度数据:

# 生成连续x序列,间隔可自行调整(这里设为1)
x_seq <- seq(min(data$Distance), max(data$Distance), by = 1)

# 对Min场景做线性插值
min_interp <- approx(
  x = data$Distance[data$Scenario == "Min"],
  y = data$Depth[data$Scenario == "Min"],
  xout = x_seq
)

# 对Gen场景做线性插值
gen_interp <- approx(
  x = data$Distance[data$Scenario == "Gen"],
  y = data$Depth[data$Scenario == "Gen"],
  xout = x_seq
)

# 合并成插值后的数据集
interp_data <- data.frame(
  Distance = x_seq,
  Min = min_interp$y,
  Gen = gen_interp$y
)

如果想要更平滑的曲线,可将approx替换为spline函数实现平滑插值。

3. 绘制高亮区域与原始曲线

使用插值后的数据集调用geom_ribbon填充区域,同时保留原始曲线:

library(ggplot2)

ggplot() +
  # 填充两条曲线之间的区域,自动识别上下边界
  geom_ribbon(
    data = interp_data,
    aes(x = Distance, ymin = pmin(Min, Gen), ymax = pmax(Min, Gen)),
    fill = "lightblue", alpha = 0.3
  ) +
  # 绘制原始的两条场景曲线
  geom_line(data = data, aes(x = Distance, y = Depth, color = Scenario)) +
  theme_bw()

pmin和pmax用来自动匹配每个x位置的上下边界,避免因场景深度大小变化导致填充错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:42:35