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

如何在ggplot2中按月份对齐不同年份的周数据坐标轴

解决ggplot2中年份间同月份周数据对齐问题

问题需求

需要在ggplot2绘制的时序柱状图中,让不同年份的周数据按同一月份的周位置对齐(比如6月的第1周在各年份的x轴位置一致),允许部分周因采集差异无法对齐,核心是实现同月份内的时序模式对比。

原代码问题

原代码直接使用date_in作为x轴,且设置了scales="free",导致各年份x轴刻度独立,无法实现同月份周的对齐。

解决步骤

1. 数据预处理:生成完整日期与月内周标识

首先将date_in(月/日)与year合并为完整日期,再计算每个日期在对应月份中的周序号(即该日期是当月的第几个周),以此作为对齐依据:

library(tidyverse)
library(lubridate)
library(ggplot2)
library(ggthemes)

# 处理数据集:生成完整日期、月份、月内周数
df_processed <- df %>%
  # 合并年、月、日为完整日期
  mutate(full_date = dmy(paste(date_in, year))) %>%
  # 提取月份(英文缩写,方便标注)
  mutate(month = month(full_date, label = TRUE, abbr = TRUE)) %>%
  # 计算每个日期在当月的周数(每周从周一开始算)
  group_by(year, month) %>%
  mutate(week_in_month = ceiling(day(full_date)/7)) %>%
  ungroup() %>%
  # 生成用于x轴的组合标识:月份-月内周数
  mutate(x_label = paste(month, week_in_month, sep = "-")) %>%
  # 按完整日期排序,保证时序正确
  arrange(full_date)

2. 绘制对齐后的时序图

使用x_label作为x轴变量,关闭x轴的自由刻度(scales="fixed"),同时调整分面和轴标签,实现同月份周的对齐:

p <- ggplot(df_processed, aes(x = x_label, y = total_count, fill = Treatment)) +
  geom_col(position = "dodge") +
  # 分面:各年份垂直排列,x轴刻度固定对齐
  facet_wrap(~year, ncol = 1, scales = "fixed", strip.position = "right") +
  theme_few(base_size = 10, base_family = "Arial") +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, color = "black"),
    axis.text.y = element_text(vjust = 0.5, color = "black"),
    axis.title = element_text(color = "black"),
    strip.text = element_text(face = "bold", color = "black"),
    legend.position = "top"
  ) +
  scale_fill_manual(values = c("IP" = "blue", "LD" = "red")) +
  # 修改x轴标题,标注月内周信息
  labs(x = "月份-月内周数", y = "总计数")

print(p)

关键说明

  • week_in_month的计算采用ceiling(day(full_date)/7),简单直接将每月按7天划分为周,若需要更精准的周定义(比如按ISO周),可调整为基于week()函数的相对计算。
  • 关闭scales="free"是实现对齐的核心,确保所有分面的x轴刻度一致,仅显示各年份实际存在的周数据。
  • x_label用“月份-周数”的格式,既保留时序信息,又能直观区分同月份的不同周。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:30:56