ggplot2:重新排序图例中的项目

Posted

技术标签:

【中文标题】ggplot2:重新排序图例中的项目【英文标题】:ggplot2: Reorder items in a legend 【发布时间】:2021-12-01 02:41:01 【问题描述】:

我有一个堆积条形图,我想重新排列图例的显示方式。我希望图例显示“社会”、“经济”和“环境”的顺序,但颜色保持不变。我一直在尝试不同的解决方案,但我是新手,可能写错了!

我认为我在正确的轨道上,但它不起作用:

mortality_df$subsystem <- factor(mortality_df$subsystem, levels = c("Social", "Economic", "Environmental"))

没有对图例重新排序的代码:

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))

mortality_df

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

创建这个:

Diabetes plot

【问题讨论】:

也许你可以试试这个scale_fill_manual(breaks = c("Social", "Economic", "Enviromental), values = c("red", "green", "blue") 也许 fill = rev(subsystem) 有效?我没有数据,所以无法测试。 @pbraeutigm 是的,我意识到这可能是个问题。我不太确定如何在这里共享数据集。谢谢你的建议! 我没有你的数据,所以很难确切知道,但你可以试试+ scale_x_discrete(limits=c( "Social", "Economic", "Environmental")) (1) 重复之前的评论,“我无法测试它” 很重要:我们没有样本数据,所以这只是推测。 (2) 我在ggplot2 中找不到关于ordering(轴或图例元素)的问题,使用factor(., levels=) 无法完全解决。当您定义factor 并使用levels= 指定所述因素的排序 时,ggplot2 倾向于遵守该规范。 (两个这样的问题:***.com/q/3253641/3358272 和 ***.com/q/12774210/3358272,尽管它们是对轴进行排序。) 【参考方案1】:

您可以通过两种主要方式更改图例中项目的顺序:

    重构数据集中的列并指定级别。这应该是您在问题中指定的方式,只要您将其正确放置在代码中即可。

    通过scale_fill_* 函数指定排序,使用breaks= 参数。

以下是使用mpg 内置数据集的子集作为示例的方法。首先,这是标准情节:

library(ggplot2)
library(dplyr)

p <- mpg %>%
  dplyr::filter(class %in% c('compact', 'pickup', 'minivan', 'suv')) %>%
  ggplot(aes(x=factor(year), fill=class)) +
  geom_bar() + coord_flip()
p 

通过重构改变顺序

这里的关键是确保你使用factor(...)之前你的情节代码。如果您尝试将它们连接在一起(即%&gt;%)或直接在绘图代码中重构,结果将会好坏参半。

请注意,我们的颜色与原始图相比发生了变化。这是由于ggplot 根据它们在levels(...) 中的位置将颜色值分配给每个图例键。换句话说,因子中的第一个级别获得比例中的第一种颜色,第二个级别获得第二种颜色,等等......

d <- mpg %>% dplyr::filter(class %in% c('compact', 'pickup', 'minivan', 'suv'))

d$class <- factor(d$class, levels=c('compact', 'suv', 'pickup', 'minivan'))

p <-
  d %>% ggplot(aes(x=factor(year), fill=class)) +
  geom_bar() +
  coord_flip()

使用缩放功能改变键的顺序

最简单的解决方案可能是使用scale_*_* 函数之一来设置图例中键的顺序。这将仅更改键的顺序,最终情节与原始情节相比。绘图区域面板中几何图形的图层放置、排序和着色将保持不变。我相信这就是你想要做的。

您想要访问 scale_fill_discrete() 函数的 breaks= 参数 - 而不是 limits= 参数。

p + scale_fill_discrete(breaks=c('compact', 'suv', 'pickup', 'minivan'))

【讨论】:

感谢您的全面回答@chemdork123!它们非常有用。我使用了: scale_fill_discrete(limits = c("Social", "Economic", "Environmental")) 这在不改变颜色或改变图层位置的情况下重新排序了图例。

以上是关于ggplot2:重新排序图例中的项目的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2:移动(重新定位)图例以免阻塞图形框

ggplot2中同一图例中的不同图例键

在ggplot2中的图表下方绘制图例和图例标题上方的图例

R语言ggplot2可视化:去除可视化结果中的NA图例删除缺失值图例

ggplot2中的图例标题位置

使用 ggplot2 获取图例以正确显示