如何替换ggpattern图例,仅保留S5x与S5z指定项
解决方案
直接通过设置scale的breaks参数筛选要保留的图例项,同时整合fill和pattern的图例避免重复,以下是修改后的完整代码:
library("ggplot2") library("ggpattern") data <- (" Var1 Frequency group Proportion Percentage Type A 10 P 0.1250 12% P B 4 Q2 0.0500 5% Q2 C 11 R 0.1375 14% R D 33 S5x 0.4125 41% S5 E 10 S5z 0.1250 12% S5 F 12 T 0.1500 15% T ") df <- read.table(textConnection(data), header=TRUE) # 指定要保留显示的group项 keep_groups <- c("S5x", "S5z") # 为目标group定义对应样式 fill_colors <- c(S5x = "#0072B2", S5z = "#56B4E9") patterns <- c(S5x = "stripe", S5z = "none") pattern_angles <- c(S5x = 135, S5z = 135) plotParam <- ggplot(data = df, aes(x = Type, y = Proportion, fill = group, pattern = group)) + geom_bar_pattern( stat = "identity", position = "stack", color = "black", pattern_fill = "black", pattern_color = "#0072B2" ) + # 设置fill图例:只保留目标项,指定对应颜色 scale_fill_manual( breaks = keep_groups, values = fill_colors, name = "Group" # 图例标题可按需修改 ) + # 设置pattern图例:只保留目标项,指定对应图案 scale_pattern_manual( breaks = keep_groups, values = patterns, name = "Group" # 和fill的name一致,实现图例合并 ) + # 整合图例样式,关闭单独的pattern图例 guides( fill = guide_legend( override.aes = list( pattern_angle = pattern_angles, pattern_color = "#0072B2" ) ), pattern = "none" ) plotParam
关键修改说明:
- 移除原代码中自定义的
scale_colour_discrete和scale_fill_discrete函数,改用明确的手动scale,更易控制图例显示逻辑。 - 用
keep_groups锁定要保留的图例项,在scale_fill_manual和scale_pattern_manual中通过breaks参数过滤掉不需要的图例。 - 为目标group单独绑定样式(颜色、图案、角度),避免原代码中按顺序赋值的混乱。
- 通过统一两个scale的
name实现图例合并,再关闭单独的pattern图例,只保留一个整合后的图例。 - 在
guide_legend的override.aes中仅传入目标group对应的角度参数,确保图例样式与图表一致。
内容的提问来源于stack exchange,提问作者Abiologist
相关产品推荐
相关产品推荐

