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

ggplot中stat_contour_filled结合ggpattern按条件填充区域的问题

用ggpattern条纹填充value>50区域的问题

我想用ggpattern给value大于50的区域添加条纹填充,但通过breaks参数设置后没得到预期效果,试了两种写法:

第一种尝试代码

library(tidyverse)

d <- expand.grid(x = 1:10 ,y=1:10)
d$value <- 1:100

# 目标区域集中在右上角
ggplot(data = d,aes(x = x,y = y,fill = value))+
  geom_tile()

ggplot(d)+
  stat_contour_filled(aes(x = x, y = y, z = value),
                      breaks = c(-Inf, 50, Inf),
                      geom = ggpattern::GeomPolygonPattern, 
                      pattern_angle = 60,
                      fill = 'transparent', color = NA,
                      pattern = 'stripe',
                      pattern_fill = 'black',
                      pattern_density = 0.001,
                      pattern_spacing = 0.03,
                      pattern_size = 0.3) +
  scale_pattern_manual(values = c(NA,'stripe'))

第二种尝试代码

ggplot(d)+
  stat_contour_filled(aes(x = x, y = y, z = value>50),
                      geom = ggpattern::GeomPolygonPattern, 
                      pattern_angle = 60,
                      fill = 'transparent', color = NA,
                      pattern = 'stripe',
                      pattern_fill = 'black',
                      pattern_density = 0.001,
                      pattern_spacing = 0.03,
                      pattern_size = 0.3)

当前输出效果如下:
当前输出效果


问题原因及解决方案

问题分析

  1. 第一种写法中,stat_contour_filled生成分区间多边形后,全局设置pattern='stripe'会让所有区间都应用条纹,且scale_pattern_manual未正确关联填充区间的分组;同时color=NA去掉了多边形边框,导致区域显示异常。
  2. 第二种写法用z=value>50传入逻辑值,但stat_contour_filled适配连续数值的等高线划分,逻辑值的处理不符合预期。

正确实现方式

方法一:用geom_tile_pattern直接标记目标单元格(更直观)

library(tidyverse)
library(ggpattern)

d <- expand.grid(x = 1:10 ,y=1:10)
d$value <- 1:100

ggplot(d, aes(x = x, y = y, fill = value, pattern = value > 50)) +
  geom_tile_pattern(
    pattern_angle = 60,
    pattern_fill = 'black',
    pattern_density = 0.001,
    pattern_spacing = 0.03,
    pattern_size = 0.3,
    color = "white" # 可选:添加单元格边框区分区域
  ) +
  scale_pattern_manual(values = c(NA, 'stripe')) + # 仅对value>50的区域应用条纹
  scale_fill_viridis_c() # 保留原value的颜色映射(可选)

方法二:修正stat_contour_filled的参数设置

ggplot(d) +
  stat_contour_filled(
    aes(x = x, y = y, z = value, pattern = after_stat(level)),
    breaks = c(-Inf, 50, Inf),
    geom = ggpattern::GeomPolygonPattern,
    pattern_angle = 60,
    fill = 'transparent',
    color = "black", # 恢复边框以明确区域范围
    pattern_fill = 'black',
    pattern_density = 0.001,
    pattern_spacing = 0.03,
    pattern_size = 0.3
  ) +
  scale_pattern_manual(
    values = c(NA, 'stripe'),
    guide = "none" # 可选:隐藏pattern图例
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:05:17