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

如何在ggplot2中填充两条曲线的重叠区域?

在ggplot2中填充两条活动密度曲线的重叠区域

我明白你想要在ggplot2里重现overlap包生成的带重叠区域着色的密度图的需求。其实核心问题在于确定geom_ribbon的ymin和ymax参数——我们需要填充的是两条曲线中较低的那条与x轴(y=0)之间的区域,这正是两个物种活动密度的重叠部分。

下面是具体的实现步骤,和你提供的代码完全兼容:


步骤1:获取密度数据并计算重叠区域

首先,调用overlapPlot时可以加上plot=FALSE参数,这样只会返回包含密度值的数据框,不会自动绘图,避免重复输出。然后我们计算每个x位置对应的两条密度的最小值,这就是重叠区域的上限:

library(overlap)
library(ggplot2)

# 加载示例数据
data(kerinci)
head(kerinci)

# 转换时间为弧度
timeRad <- kerinci$Time * 2 * pi

# 筛选区域2的老虎和猕猴数据
tig2 <- timeRad[kerinci$Zone == 2 & kerinci$Sps == 'tiger']
mac2 <- timeRad[kerinci$Zone == 2 & kerinci$Sps == 'macaque']

# 获取密度数据(不自动绘图)
tigmac <- overlapPlot(tig2, mac2, main="Zone 2", plot=FALSE)

# 计算重叠区域的密度上限:取两条密度曲线的最小值
tigmac$overlap <- pmin(tigmac$densityA, tigmac$densityB)

步骤2:用ggplot2绘图并填充重叠区域

我们使用geom_ribbon来填充重叠区域,注意要把填充层放在曲线层之前,这样填充区域不会遮挡曲线:

p <- ggplot() + 
  # 先绘制重叠区域填充
  geom_ribbon(data=tigmac, aes(x=x, ymin=0, ymax=overlap), fill = "red", alpha=0.5) +
  # 绘制两条密度曲线
  geom_line(data=tigmac, aes(x=x, y=densityA), color = "black") + 
  geom_line(data=tigmac, aes(x=x, y=densityB), color = "blue", linetype = "dashed") + 
  geom_hline(aes(yintercept=0)) +
  # 美化主题
  theme_bw() + 
  theme(
    panel.border = element_blank(), 
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(), 
    axis.line = element_line(colour = "black")
  ) + 
  labs(x='Time', y='Density of Activity')

# 输出图表
p

替代方案:用geom_polygon模拟overlap包的逻辑

如果你想完全复刻overlap包的绘图逻辑(它内部用polygon函数实现填充),可以构造一个多边形数据框,把x轴和两条曲线的下边界连接起来:

# 构造多边形数据:x为原x加上反转的x,y为重叠密度加上重复的0
poly_data <- data.frame(
  x = c(tigmac$x, rev(tigmac$x)),
  y = c(tigmac$overlap, rep(0, nrow(tigmac)))
)

p <- ggplot() + 
  geom_polygon(data=poly_data, aes(x=x, y=y), fill="red", alpha=0.5) +
  geom_line(data=tigmac, aes(x=x, y=densityA), color = "black") + 
  geom_line(data=tigmac, aes(x=x, y=densityB), color = "blue", linetype = "dashed") + 
  geom_hline(aes(yintercept=0)) +
  theme_bw() + 
  theme(
    panel.border = element_blank(), 
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(), 
    axis.line = element_line(colour = "black")
  ) + 
  labs(x='Time', y='Density of Activity')

p

这两种方法都能生成和overlap包完全一致的重叠区域填充效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:13:13