如何在R中基于Mask列条件为ggplot tile图添加纹理填充
要实现为Mask==1对应日期区域添加纹理填充的效果,可以借助ggplot扩展包ggpattern完成,具体操作如下:
步骤1:安装加载依赖包
首先安装并加载需要的工具包:
install.packages("ggpattern") # 未安装时先执行这行 library(tidyverse) library(ggpattern)
步骤2:预处理数据
把单独的Mask值匹配到所有分类的对应日期行,方便后续条件判断:
# 原数据生成逻辑 df <- data.frame(Date=1:5, Cat1=c(1,0,1,0,0), Cat2=c(1,1,1,0,0), Cat3=c(0,1,1,0,1), Cat4=c(0,0,1,1,0), Mask=c(0,1,1,0,0)) df <- tidyr::pivot_longer(df, -1) # 匹配Mask信息到所有绘图行 mask_ref <- df %>% filter(name == "Mask") %>% select(Date, mask_val = value) plot_data <- df %>% filter(name != "Mask") %>% left_join(mask_ref, by = "Date")
步骤3:绘制带纹理的tile图
在原有tile图层基础上,叠加一层仅在mask_val==1区域显示的纹理图层,设置填充透明避免覆盖原有底色:
ggplot(plot_data, aes(x = Date, y = factor(name, levels = rev(unique(name))), fill = as.factor(value))) + # 原有基础tile层,保留原来的黑白填充 geom_tile(color = "black") + # 叠加纹理层,仅Mask为1的区域显示 geom_tile_pattern( data = . %>% filter(mask_val == 1), pattern = "stripe", pattern_color = "black", pattern_angle = 45, pattern_density = 0.2, pattern_spacing = 0.05, fill = NA, color = "black" ) + scale_fill_manual(values = c("white", "grey50")) + # 隐藏纹理图例 scale_pattern_discrete(guide = "none") + theme_void() + theme(legend.position = "none", axis.text = element_text(size = 15), axis.title.x = element_text(size = 15), plot.margin = margin(20, 20, 20, 20))
你可以调整pattern_density(纹理密度)、pattern_spacing(纹理间距)、pattern_angle(纹理角度)参数,得到需要的纹理效果。
内容的提问来源于stack exchange,提问作者PeCaDe
相关产品推荐
相关产品推荐

