R语言分组条形图子组按计数升序排列及分组顺序调整方法
问题根源梳理
- 柱高统一为1:你首次处理数据时将计数
N转为了因子类型,且geom_bar默认使用stat="count"统计行数,每个分组仅1行数据,因此柱高均为1。 - 标签错位:你最终可行版本的
if_else逻辑本身写反了:if_else(year_approved >= 2015, "before", "after")错误将2015及之后的年份标记为before,才需要后续手动修改标签掩盖错误。 - 子组排序失效:直接在
aes中使用reorder(device_type, N)会默认按设备所有分组的N均值排序,规则不固定,容易出现排序异常。
规范实现方案
步骤1:正确处理数据
library(tidyverse) library(ggplot2) F_dev_dec <- FDA_co_tier %>% select(device_type, year_approved) %>% # 正确的时间分组逻辑 mutate(year_2015 = if_else(year_approved >= 2015, "after", "before")) %>% # 固定时间分组顺序,保证before在左、after在右 mutate(year_2015 = factor(year_2015, levels = c("before", "after"))) %>% group_by(device_type, year_2015) %>% summarise(N = n(), .groups = "drop") # 加.groups参数取消分组警告 # 自定义设备排序规则:此处按2015年后的计数N升序排列,可按需修改过滤条件调整排序依据 dev_sort_order <- F_dev_dec %>% filter(year_2015 == "after") %>% arrange(N) %>% pull(device_type) # 将设备类型转为指定顺序的因子 F_dev_dec <- F_dev_dec %>% mutate(device_type = factor(device_type, levels = dev_sort_order))
步骤2:绘制分组条形图
ggplot(F_dev_dec, aes(x = year_2015, y = N, fill = device_type)) + # geom_col等价于geom_bar(stat = "identity"),直接使用N值作为柱高 geom_col(position = position_dodge(width = 0.9), width = 0.7) + # 自定义x轴标签,无需修正错位 scale_x_discrete(labels = c("2015年前", "2015年后")) + theme_classic() + labs( x = NULL, y = "计数 (n)", fill = "设备类型" )
效果说明
- 时间分组顺序固定:通过因子水平提前指定,保证2015年前分组始终在左侧。
- 子组排序稳定:提前定义设备类型的因子顺序,可灵活指定按before/after组的计数排序,不会出现排序漂移。
- 无逻辑错误:修正了时间分组的赋值逻辑,无需手动修正标签掩盖问题。
内容的提问来源于stack exchange,提问作者XFrost
相关产品推荐
相关产品推荐

