如何为ggplot2 facet_grid各分面按预期寿命重排国家因子水平?
解决分面内因子重新排序的问题
你现在遇到的核心问题是:原来的reorder是基于所有选中年份(1970+2010)的life_expectancy中位数来排序国家,而不是每个分面(年份)内部单独排序。要实现每个年份的柱子按预期寿命升序排列,我们需要按年份分组后再重新调整国家的因子水平。
修改后的代码
library(tidyverse) gapminder %>% dplyr::filter(continent == "Africa" & year %in% c(1970, 2010)) %>% # 按年份分组,在每个组内重新排序国家 group_by(year) %>% mutate(country = forcats::fct_reorder(country, life_expectancy)) %>% ungroup() %>% # 取消分组,避免后续ggplot的潜在问题 ggplot(aes(x = country, y = life_expectancy, fill = region)) + geom_col() + facet_grid(. ~ year) + theme( axis.text.x = element_text(angle = 90, hjust = 1), legend.position = "none" )
关键解释
group_by(year):这一步是核心,它让我们后续的排序操作只针对每个年份内部的数据,而不是整个数据集。fct_reorder(country, life_expectancy):使用forcats包的fct_reorder函数(比base R的reorder更直观),将country这个因子的水平按照life_expectancy的升序重新排列。如果想要降序排列,只需要改成fct_reorder(country, desc(life_expectancy))即可。ungroup():分组后记得取消分组,避免后续ggplot处理数据时出现意外的分组行为。
为什么原来的代码不行?
你之前用的mutate(country = reorder(country, life_expectancy, FUN = median))是计算了每个国家在1970和2010年两个年份的预期寿命中位数,然后基于这个中位数排序——这就导致两个分面的国家顺序是一样的,而不是每个年份单独按当年的预期寿命排序。
这样修改后,每个年份的柱子都会按当年的预期寿命从低到高排列,你就能清晰对比两年间各国排名的变化啦!
内容的提问来源于stack exchange,提问作者umbecdl
相关产品推荐
相关产品推荐

