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

在ggplot2中修改X轴标签:实现按年分组显示月份标签

实现双层X轴:年份横向、月份纵向的柱状图效果

我来帮你搞定这个X轴标签的需求!你的核心目标是让年份作为横向标签出现在X轴底部,对应的月份纵向显示在年份上方,每个年份下的月度支出柱子清晰区分。下面给你两种可行的方案,优先推荐第一种(分面法),因为它简洁易维护,效果也更直观。

方案1:用facet_wrap分面实现(推荐)

这个方法把每个年份单独作为一个子图,年份标签放在子图底部(横向),子图的X轴显示对应年份的月份(纵向),完美匹配你的需求。

步骤1:预处理数据

先从Mth_Year里提取月份信息,同时把年份转成因子保证顺序正确:

library(ggplot2)
library(dplyr)
library(lubridate) # 可选,用来生成更友好的月份缩写

yearly_spending <- yearly_spending %>%
  # 把Mth_Year转成日期,提取月份缩写(比如Jan、Feb)
  mutate(Date = dmy(paste0("01-", Mth_Year)),
         Month = month(Date, label = TRUE, abbr = TRUE),
         Year = factor(Year)) # 转成因子,确保分面按年份顺序排列

步骤2:绘制图表

用facet_wrap按年份分面,设置strip.position = "bottom"把年份标签放在X轴底部,同时调整主题让月份纵向显示:

ggplot(data = yearly_spending, aes(x = Month, y = Mth_Spend, fill = Month)) +
  geom_bar(stat = "identity", color = "black") +
  # 按年份分面,标签放在底部,每个分面X轴独立适配
  facet_wrap(~Year, nrow = 1, scales = "free_x", space = "free_x", strip.position = "bottom") +
  # 调整主题样式
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5), # 月份纵向显示,优化对齐
    strip.text.x = element_text(angle = 0, hjust = 0.5, size = 11, face = "bold"), # 年份横向加粗
    strip.background = element_blank(), # 去掉分面标签的背景,更清爽
    axis.title.x = element_blank(), # 不需要额外X轴标题,年份已经清晰显示
    legend.position = "none" # 如果不需要月份图例,可以隐藏
  )

方案2:用ggtext实现双层X轴(同一图内)

如果不想分面,想在同一个图表里实现双层X轴,可以用ggtext包渲染带格式的标签,不过对齐需要更细致的调整:

步骤1:安装并加载ggtext

install.packages("ggtext")
library(ggtext)

步骤2:创建带格式的X轴标签

把月份(纵向)和年份(横向)组合成HTML格式的标签:

yearly_spending <- yearly_spending %>%
  mutate(
    Date = dmy(paste0("01-", Mth_Year)),
    Month = month(Date, label = TRUE, abbr = TRUE),
    # 用HTML设置月份旋转90度,年份在下方
    x_label = paste0(
      "<span style='display: inline-block; transform: rotate(90deg); font-size: 10pt;'>", 
      Month, 
      "</span><br><span style='font-size: 12pt;'>", 
      Year, 
      "</span>"
    )
  )

步骤3:绘制图表

用element_markdown渲染带格式的标签:

ggplot(data = yearly_spending, aes(x = x_label, y = Mth_Spend, fill = Month)) +
  geom_bar(stat = "identity", color = "black", position = position_dodge()) +
  theme(
    axis.text.x = element_markdown(angle = 0, hjust = 0.5, vjust = 1), # 调整标签对齐
    axis.title.x = element_blank(),
    legend.position = "none"
  )

为什么你的原代码没达到效果?

你原来的代码把x设为Year,所以ggplot会把每个年份作为一个X轴刻度,所有月度柱子都挤在同一个年份刻度下,自然无法显示月份标签。通过分面或者双层标签的方式,我们把月份和年份的层级关系清晰地展示了出来。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:54:47