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

如何为ggplot条形图设置特定排序与年度分组轴标签

问题:ggplot条形图按自定义月份年份顺序排列并分组标注年份

我想用ggplot绘制以pg为y轴、month_year为x轴的条形图,现有数据包含April、June、August、October的month_year值。当前用以下代码绘制的条形未按「April→June→August→October」的季节顺序及年份先后排列:

p <- ggplot(subset(mesohab_r_file, site %in% "ds_laverstock_br_"), aes(x = month_year, y = pg)) + geom_bar(stat = "identity")
p + coord_flip()

理想效果为条形按「April 2013、June 2013、August 2013、October 2013、April 2014…」的顺序排列,且x轴仅显示年度标签(同一年份的多个月份条形归为一组,标注对应年份)。示例数据如下:

site <- c("ds_laverstock_br_","ds_laverstock_br_","ds_laverstock_br_","ds_laverstock_br_","ds_laverstock_br_","ds_laverstock_br_","ds_laverstock_br_", "ds_laverstock_br_")
month_year <-c("April_2013","June_2013","August_2013","October_2013","April_2014","June_2014","August_2014","October_2014")
pg <- c(100,200,300,400,500,600,700,800)
meso <- data.frame(site, month_year, pg)

解决方案

1. 预处理数据:拆分字段并设置自定义顺序

首先需要把month_year拆分为单独的月份和年份字段,再将月份设置为有序因子,强制指定你需要的季节顺序:

library(tidyverse)

# 拆分月份年份,定义月份顺序并排序数据
meso_processed <- meso %>%
  separate(month_year, into = c("month", "year"), sep = "_") %>%
  mutate(
    # 按需求设置月份的固定顺序
    month = factor(month, levels = c("April", "June", "August", "October"), ordered = TRUE),
    year = factor(year)
  ) %>%
  arrange(year, month) # 按年份+月份顺序排序数据

2. 用分面实现年份分组(推荐方案)

使用facet_grid按年份分组,能自动将同一年份的条形归为一组并显示年份标签,配合coord_flip()适配横向条形图:

ggplot(meso_processed, aes(x = month, y = pg)) +
  geom_bar(stat = "identity") +
  # 按年份纵向分面,每个年份单独成组
  facet_grid(year ~ ., scales = "free_y", space = "free_y") +
  coord_flip() +
  # 调整标签和主题样式
  labs(x = "月份", y = "pg") +
  theme(
    strip.text.y = element_text(size = 12, face = "bold"),
    strip.background = element_blank(),
    axis.text.y = element_text(size = 10)
  )

3. 无分面的替代方案(手动添加分组标签)

如果不想用分面,可以通过自定义x轴刻度和添加标注实现年份分组:

ggplot(meso_processed, aes(x = interaction(year, month), y = pg)) +
  geom_bar(stat = "identity") +
  # 自定义x轴仅显示月份标签
  scale_x_discrete(labels = meso_processed$month) +
  # 添加年份分组标签(位置对应每组中间)
  annotate("text", 
           x = c(2, 6), 
           y = -50, 
           label = c("2013", "2014"),
           size = 5, face = "bold") +
  coord_flip() +
  labs(x = "", y = "pg") +
  theme(axis.text.y = element_text(size = 10))

内容的提问来源于stack exchange,提问作者milzyrj21

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:45:12