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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:37:49