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)
当前输出效果如下:
问题原因及解决方案
问题分析
- 第一种写法中,
stat_contour_filled生成分区间多边形后,全局设置pattern='stripe'会让所有区间都应用条纹,且scale_pattern_manual未正确关联填充区间的分组;同时color=NA去掉了多边形边框,导致区域显示异常。 - 第二种写法用
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
相关产品推荐
相关产品推荐

