在ggplot2中为柱状图添加Speech_VP额外填充变量的实现方法
解决方案:给指定柱状图添加图案区分并优化图例
示例数据集构造
先模拟符合你需求的数据集,方便直接测试代码:
library(tidyverse) library(ggpattern) # 构造数据 set.seed(123) data <- tibble( Congruency = rep(c("Congruent", "Incongruent"), each=6), Event = rep(c("oration", "interview", "speech"), 4), Speech_VP = c("CH", "N", "N", "N", "N", "N", "CH", "N", "N", "N", "N", "N"), n = sample(10:30, 12, replace=T) )
优化后的ggpattern绘图代码
针对你遇到的适配问题,调整参数后可实现需求:
ggplot(data, aes(x=Event, y=n, fill=Congruency)) + # 堆叠柱状图,精准控制图案显示 geom_col_pattern( position="stack", pattern_fill="black", pattern_angle=45, pattern_density=0.1, pattern_spacing=0.05, # 仅oration事件的CH显示斜线,其余为纯色 pattern=ifelse(data$Event=="oration" & data$Speech_VP=="CH", "stripe", "none") ) + # 自定义图案图例 scale_pattern_manual( values = c("stripe"="stripe", "none"="none"), labels = c("CH (带斜线)", "N (纯色)"), name = "Speech_VP类型" ) + scale_fill_brewer(palette="Set2", name="一致性类型") + theme_minimal() + labs(x="事件类型", y="数量")
关键调整说明
- 用
ifelse精准触发图案:仅目标柱子显示斜线,避免全局应用图案导致的适配问题 - 调整
pattern_density和pattern_spacing:如果之前图案过密或错位,修改这两个参数可优化显示效果 - 拆分图例:将图案和颜色图例分开,让读者清晰区分两类信息
备选方案(无需ggpattern)
如果ggpattern仍有兼容问题,可通过图层叠加模拟斜线:
# 绘制基础堆叠柱状图 p <- ggplot(data, aes(x=Event, y=n, fill=Congruency)) + geom_col(position="stack") + scale_fill_brewer(palette="Set2") + theme_minimal() # 给目标柱子添加斜线纹理 p + geom_text( data = filter(data, Event=="oration" & Speech_VP=="CH"), aes(label=strrep("/", 20)), color="black", size=3, angle=45, position=position_stack(vjust=0.5) ) + # 手动添加自定义图例 annotate("rect", x=3.2, y=25, width=0.1, height=3, fill="#66C2A5") + annotate("text", x=3.35, y=26.5, label="CH (带斜线)") + annotate("rect", x=3.2, y=21, width=0.1, height=3, fill="#FC8D62") + annotate("text", x=3.35, y=22.5, label="N (纯色)")
这个方案无需额外依赖包,适合对ggpattern兼容性有顾虑的场景。
内容的提问来源于stack exchange,提问作者Wangana
相关产品推荐
相关产品推荐

