如何在ggplot2的facet grid中按分组过滤x轴类别?
解决facet grid面板x轴仅显示关联单元类型的问题
要实现每个facet面板只显示对应构件段类型(Var2)的关联单元类型(Var3),可以通过数据过滤+调整facet参数两步完成:
1. 先清理数据(关键前提)
确保数据中只保留「构件段类型-单元类型」的有效关联组合,过滤掉无关联或百分比为0的行(如果存在这类无效行):
# 过滤无效行(可根据实际关联规则调整过滤条件) clean_data <- CUDT_2015_2019_Percent_Filter %>% filter(Percent > 0) %>% # 去掉百分比为0的无效条目 # 如果有明确的关联规则,比如Bent类仅保留指定单元,可加额外过滤: # filter(!(Var2 == "Bent" & !Var3 %in% c("Column Head", "Column"))) group_by(Var2) %>% mutate(Var3 = factor(Var3)) %>% # 按构件段分组重置单元类型的因子水平,清空无效水平 ungroup()
2. 修改绘图代码,开启自由x轴
在facet_grid中添加scales = "free_x"和space = "free_x"参数,让每个面板的x轴仅显示当前构件段下存在的单元类型,同时自适应面板宽度:
CUDT_2015_2019_Percent_plot <- clean_data %>% ggplot(aes(Var3, Percent, fill = Var4)) + geom_col() + facet_grid(Var1 ~ Var2, scales = "free_x", space = "free_x") + # 核心参数 theme(axis.text.x = element_text(angle = 90, size = 8, hjust = 1, vjust = 0)) + labs(fill = "损伤类型", x = "单元类型") + scale_fill_manual(values = DColour)
说明:
scales = "free_x":让每个面板的x轴独立显示仅存在的变量水平space = "free_x":让面板宽度根据x轴内容多少自适应,避免窄面板挤在一起- 提前按
Var2分组重置Var3的因子水平,是为了彻底清除数据中不存在的单元类型水平,防止空标签残留
内容的提问来源于stack exchange,提问作者Christina Robinson
相关产品推荐
相关产品推荐

