ggplot2:重新排序图例中的项目
ggplot2: Reorder items in a legend
我有一个堆叠条形图,我想重新排序图例的显示方式。我希望图例显示“社会”、“经济”和“环境”的顺序,但颜色保持不变。我一直在尝试不同的解决方案,但我是新手,可能写错了东西!
我认为我的做法是正确的,但它不起作用:
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
您可以通过两种主要方式更改图例中项目的顺序:
重构数据集中的列并指定级别。这应该是您在问题中指定的方式,只要您将其正确放置在代码中即可。
使用 breaks=
参数通过 scale_fill_*
函数指定排序。
以下是如何使用 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(...)
。如果您试图将它们组合在一起(即 %>%
)或在绘图代码中重构,结果将是混合的。
另请注意,与原始图相比,我们的颜色发生了变化。这是由于 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'))
我有一个堆叠条形图,我想重新排序图例的显示方式。我希望图例显示“社会”、“经济”和“环境”的顺序,但颜色保持不变。我一直在尝试不同的解决方案,但我是新手,可能写错了东西!
我认为我的做法是正确的,但它不起作用:
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
您可以通过两种主要方式更改图例中项目的顺序:
重构数据集中的列并指定级别。这应该是您在问题中指定的方式,只要您将其正确放置在代码中即可。
使用
breaks=
参数通过scale_fill_*
函数指定排序。
以下是如何使用 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(...)
。如果您试图将它们组合在一起(即 %>%
)或在绘图代码中重构,结果将是混合的。
另请注意,与原始图相比,我们的颜色发生了变化。这是由于 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'))