多层ggplot堆叠柱状图中分面内堆叠段按降序排列问题咨询
解决方案
问题原因
ggplot2默认的堆叠段顺序由fill映射的因子全局水平决定,无法适配不同分面、不同x轴类别下的自定义排序需求。你原代码中使用fct_reorder2生成的是class列的全局因子排序,自然无法满足每个分面、每个柱子内堆叠段按数值降序排列的要求。另外你原代码中加载的包名有误,正确的绘图包名称是ggplot2而非ggplot。
实现方法
方法1:使用tidytext包的分组排序工具(无需提前汇总数据)
该方法适合保留原始行级数据的场景,直接通过映射group参数实现分组内排序:
# 加载依赖包 library(ggplot2) library(tidytext) ggplot(mpg, aes( x = manufacturer, y = cyl, # 按年+厂商分组,对class按cyl求和值降序排序 group = reorder_within(class, -cyl, list(year, manufacturer)), fill = class )) + geom_col() + facet_wrap(.~year)
方法2:提前汇总数据后排序(适合需要预先统计的场景)
如果需要先对数据做聚合统计,可先分组求和再生成组内排序标识,映射到group参数即可:
# 加载依赖包 library(ggplot2) library(dplyr) # 数据预处理:分组求和+生成组内排序标识 mpgtest <- mpg %>% group_by(year, manufacturer, class) %>% summarise(total_cyl = sum(cyl), .groups = "drop") %>% group_by(year, manufacturer) %>% arrange(desc(total_cyl)) %>% mutate(group_order = row_number()) # 绘图 ggplot(mpgtest, aes( x = manufacturer, y = total_cyl, group = group_order, fill = class )) + geom_col() + facet_wrap(.~year)
两种方法都可以实现每个分面下,每个厂商对应的堆叠柱内部的填充段按数值从高到低降序排列。
内容的提问来源于stack exchange,提问作者Krisselack
相关产品推荐
相关产品推荐

