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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:27:04