You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:18:03