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

如何在R ggplot的月度时间序列中设置x轴全月份刻度

解决ggplot折线图X轴显示全年12个月份的问题

问题描述

现有包含dep_delay(起飞延误时长)和date(日期)的数据集,按日期分组计算日均起飞延误后绘制折线图,默认X轴仅显示部分月份(如Jan 2013、April 2013),需要调整为显示January到December所有完整月份的刻度与标签,此前尝试的代码未达到预期效果。

数据集示例:

dep_delay   date
1  47         2013-01-01
2  1          2013-01-01
3  1          2013-01-01
...
36 4          2013-01-02
37 5          2013-01-02
38 11         2013-01-02
...
911   4       2013-05-15
912   1       2013-05-15
...
3009  17      2013-12-30
3010  28      2013-12-30

原绘图代码:

df %>% group_by(date) %>%
  summarise(dep_delay= mean(dep_delay)) %>%
  ggplot() +
  aes(x=date, y= dep_delay) +
# scale_x_date(labels = lbls, breaks = brks) +
  geom_line()

此前尝试的错误代码:

brks <- df$date[seq(1, unique(month(df$date), 12))]
lbls <- lubridate::month(brks)

解决方案

问题出在brks的生成逻辑错误,没有正确定位每个月的起始日期。正确做法是生成2013年每个月的第一天作为刻度点,再搭配完整月份名称作为标签:

完整代码

library(tidyverse)
library(lubridate)

# 预处理数据:按日期分组计算日均延误
daily_avg_delay <- df %>%
  group_by(date) %>%
  summarise(dep_delay = mean(dep_delay, na.rm = TRUE)) %>%
  ungroup()

# 生成X轴刻度:2013年每个月的第一天
brks <- seq(ymd("2013-01-01"), ymd("2013-12-01"), by = "month")
# 生成X轴标签:完整月份名称(如January)
lbls <- month(brks, label = FALSE, abbr = FALSE)

# 绘制折线图并设置X轴
ggplot(daily_avg_delay) +
  aes(x = date, y = dep_delay) +
  geom_line() +
  scale_x_date(
    breaks = brks,
    labels = lbls,
    expand = c(0, 0) # 可选:让刻度贴近图表边缘
  ) +
  labs(x = "月份", y = "日均起飞延误时长") # 可选:添加轴标签

代码解释

  1. 生成刻度点(brks):用seq()结合ymd()生成2013年1月1日到12月1日的每月起始日期,确保每个月份都有一个刻度点。
  2. 生成标签(lbls):用lubridate::month()的abbr = FALSE参数生成完整的月份英文名称(如January而非Jan)。
  3. scale_x_date配置:将生成的刻度和标签传入,expand = c(0,0)可选,用于消除X轴两端的空白,让刻度更贴合数据范围。

补充说明

如果需要中文月份标签,只需调整lbls的生成逻辑:

lbls <- c("一月", "二月", "三月", "四月", "五月", "六月", 
          "七月", "八月", "九月", "十月", "十一月", "十二月")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:01:00