R语言填充等高线图条纹样式实现问题求助
实现带条纹样式的填充等高线图(叠加展示交集)
问题背景
需要叠加两个填充等高线图展示交集区域,要求用条纹(或彩色条纹)替代纯色填充,并支持透明度设置,但遇到以下问题:
- 基础R的
filled.contour()函数没有类似polygon()的density和angle参数,无法直接绘制条纹填充 - ggplot2的ggpattern包暂不支持
geom_contour_filled(),现有代码无法生成条纹样式
解决方案
方法一:基础R手动绘制条纹等高线
核心思路是先提取等高线的多边形坐标,再用polygon()的条纹参数逐个绘制,叠加时通过透明度区分交集。
# 替换成你的真实数据 x <- seq(-2, 2, length.out = 100) y <- seq(-2, 2, length.out = 100) z1 <- outer(x, y, function(x, y) dnorm(x)*dnorm(y)) # 第一个数据集 z2 <- outer(x, y, function(x, y) dnorm(x, mean=1)*dnorm(y, mean=1)) # 第二个数据集 # 提取等高线水平(可根据需求调整) levels1 <- quantile(z1, c(0.5, 0.9)) contour1 <- contourLines(x, y, z1, levels = levels1) levels2 <- quantile(z2, c(0.5, 0.9)) contour2 <- contourLines(x, y, z2, levels = levels2) # 初始化画布 plot(0, 0, type="n", xlim=range(x), ylim=range(y), xlab="pi1", ylab="pi2") # 绘制第一个数据集的条纹填充:密度10,45度角,深灰,透明度0.6 for (line in contour1) { polygon(line$x, line$y, density=10, angle=45, col="darkgrey", border=NA, alpha=0.6) } # 绘制第二个数据集的条纹填充:密度10,-45度角,蓝色,透明度0.6(交叉条纹区分交集) for (line in contour2) { polygon(line$x, line$y, density=10, angle=-45, col="blue", border=NA, alpha=0.6) }
方法二:ggplot2结合ggpattern实现条纹填充
因为geom_contour_filled()不支持ggpattern,所以先将等高线转换为多边形数据框,再用geom_pattern_polygon()绘制条纹。
library(ggplot2) library(ggpattern) library(dplyr) # 替换成你的真实数据 x <- seq(-2, 2, length.out = 100) y <- seq(-2, 2, length.out = 100) z1 <- outer(x, y, function(x, y) dnorm(x)*dnorm(y)) z2 <- outer(x, y, function(x, y) dnorm(x, mean=1)*dnorm(y, mean=1)) # 自定义函数:将等高线转换为ggplot可用的多边形数据框 contour_to_poly <- function(x, y, z, levels, group_prefix) { contour_lines <- contourLines(x, y, z, levels = levels) poly_list <- lapply(seq_along(contour_lines), function(i) { line <- contour_lines[[i]] data.frame( x = line$x, y = line$y, group = paste0(group_prefix, i), dataset = group_prefix ) }) bind_rows(poly_list) } # 转换两个数据集的等高线为多边形 poly1 <- contour_to_poly(x, y, z1, levels = quantile(z1, c(0.5, 0.9)), group_prefix = "Agreement") poly2 <- contour_to_poly(x, y, z2, levels = quantile(z2, c(0.5, 0.9)), group_prefix = "No agreement") # 合并数据 all_poly <- bind_rows(poly1, poly2) # 绘制带条纹的等高线图 ggplot(all_poly, aes(x = x, y = y, group = group)) + geom_pattern_polygon( aes(pattern_fill = dataset), pattern = "stripe", pattern_density = 0.1, # 条纹密度 pattern_angle = aes(angle = ifelse(dataset == "Agreement", 45, -45)), # 区分条纹角度 alpha = 0.6, # 透明度 color = NA ) + scale_pattern_fill_manual( values = c("Agreement" = "grey32", "No agreement" = "grey68"), labels = c("Agreement", "No agreement") ) + labs(x = "pi1", y = "pi2", pattern_fill = "Group") + theme_minimal()
关于“创建条纹色当作普通颜色使用”
可以用grid包生成条纹光栅并转换为颜色对象,但上述两种方法更直接,无需额外创建自定义颜色,就能实现条纹填充和叠加效果。
内容的提问来源于stack exchange,提问作者DreDev
相关产品推荐
相关产品推荐

