ggplot2如何调整堆叠条形图的图例顺序且保留原有配色
你之前调整因子水平的思路是正确的,失效大概率是代码执行顺序问题:你调整因子的操作没有同步到绘图使用的数据集当中。以下是两种可行的实现方案,均可以保留原有颜色和类别的对应关系:
方案1:修改数据集因子水平(适合需要全局统一分类顺序的场景)
把调整因子水平的步骤放到数据处理的管道流程中,确保绘图使用的数据集已经应用了调整:
mortality_df <- results_df %>% pivot_longer( cols = starts_with("imp_"), names_to = "mortality", names_prefix = "imp_", values_to = "importance" ) %>% relocate(c(feature, subsystem, mortality, importance, label)) %>% # 新增以下行调整因子水平,顺序和你需要的图例顺序一致 mutate(subsystem = factor(subsystem, levels = c("Social", "Economic", "Environmental"))) # 绘图代码无需修改,运行即可得到调整后顺序的图例 diabetes_plot <- mortality_df %>% filter(mortality == "diabetes") %>% filter(importance > 0) %>% ggplot(aes(x = reorder(label, importance), y = importance, fill = subsystem)) + geom_bar(stat = "identity") + coord_flip() + scale_y_continuous(name = "Importance Score") + scale_x_discrete(name = "") + theme_minimal() + theme(aspect.ratio = 1.45) diabetes_plot
方案2:绘图层面直接调整图例顺序(无需修改原始数据集,更灵活)
不需要改动数据处理逻辑,仅在绘图代码中新增scale_fill_discrete配置指定图例顺序即可,原有颜色对应关系完全不变:
diabetes_plot <- mortality_df %>% filter(mortality == "diabetes") %>% filter(importance > 0) %>% ggplot(aes(x = reorder(label, importance), y = importance, fill = subsystem)) + geom_bar(stat = "identity") + coord_flip() + scale_y_continuous(name = "Importance Score") + scale_x_discrete(name = "") + # 新增以下行指定图例顺序,如果你之前使用了自定义颜色的scale_fill_manual,给该函数加同样的breaks参数即可 scale_fill_discrete(breaks = c("Social", "Economic", "Environmental")) + theme_minimal() + theme(aspect.ratio = 1.45) diabetes_plot
内容的提问来源于stack exchange,提问作者gg0ldst
相关产品推荐
相关产品推荐

