如何在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
相关产品推荐
相关产品推荐

