ggplot2 facet_grid条形图:各分面内值降序排序失效问题
解决ggplot2 facet_grid分面内条形图单独降序排序的问题
你遇到的问题很常见:reorder(Agent, -value)是基于整个数据集的全局排序,它默认会计算每个Agent对应的value的均值(或者你指定的函数)来排序,而不是针对每个分面(Period和variable的组合)单独排序,所以没法实现每个分面内的条形降序排列。
下面给你两种实用的解决方案:
方法1:用dplyr分组自定义因子水平(最直观可控)
通过对数据按分面维度分组,手动设置每个组内Agent的因子水平顺序,这样每个分面的条形就会按组内value降序排列:
library(ggplot2) library(dplyr) # 先处理数据:按分面的两个维度分组,重新定义Agent的因子水平 data_sorted <- data %>% # 按每个分面的组合分组 group_by(Period, variable) %>% # 将Agent转换为因子,水平按组内value降序排列 mutate(Agent = factor(Agent, levels = Agent[order(-value)])) %>% ungroup() # 绘制图表 ggplot(data_sorted, aes(x = Agent, y = value)) + geom_bar(position = "dodge", stat = 'identity') + facet_grid(Period~variable, scales = "free", space="free")
方法2:用forcats包的fct_reorder2函数(更简洁)
forcats包的fct_reorder2函数专门支持基于分组变量的排序,不用提前处理数据集,直接在绘图时使用:
library(ggplot2) library(forcats) ggplot(data, aes(x = fct_reorder2(Agent, Period, variable, -value), y = value)) + geom_bar(position = "dodge", stat = 'identity') + facet_grid(Period~variable, scales = "free", space="free") + labs(x = "Agent") # 修正x轴标签,避免函数自动添加的额外信息
为什么原来的方法不生效?
再帮你理清楚逻辑:reorder(Agent, -value)的工作逻辑是,对整个数据集中的每个Agent,计算其对应的value的全局均值(默认),然后根据这个均值排序。比如某个Agent在一个分面里value很高,但在其他分面里很低,它的全局均值可能不高,所以在所有分面里的位置都不会是最顶端,这就导致分面内的排序不符合预期。
而上面的两种方法都是基于每个分面的分组来排序,确保每个分面内的条形都按该分面的value降序排列。
内容的提问来源于stack exchange,提问作者cdjemiel
相关产品推荐
相关产品推荐

