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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:09:02