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

如何在ggplot2的X轴按顺序绘制相邻两年的ISO周数?

解决ggplot2中跨年度周数的排序问题

方法1:通过年份+周数组合键排序

创建包含年份和周数的组合字段,以此为依据指定week因子的水平顺序,确保X轴按实际时间先后排列,同时仅显示周数:

library(ggplot2)
library(dplyr)

df.demo <- data.frame(
  year = c(2022,2022,2022,2022,2023,2023,2023,2023),
  week = as.integer(c(49,50,51,52,1,2,3,4)),
  y = c(10,11,12,13,20,21,22,23)
)

# 生成年份+周数的组合键,按该键排序后设置week的因子水平
df.demo <- df.demo %>%
  mutate(week_year = paste(year, week, sep = "-"),
         week = factor(week, levels = week[order(week_year)]))

ggplot(df.demo, aes(x = week, y = y)) + 
  geom_col() +
  labs(x = "周数")

方法2:利用日期转换自动排序(无需手动指定顺序)

借助lubridate将年份+周数转换为实际日期,以此为依据对周数进行排序,完全避免手动指定因子水平的操作:

library(ggplot2)
library(lubridate)
library(forcats)

df.demo <- data.frame(
  year = c(2022,2022,2022,2022,2023,2023,2023,2023),
  week = as.integer(c(49,50,51,52,1,2,3,4)),
  y = c(10,11,12,13,20,21,22,23)
)

# 通过日期排序重排周数的显示顺序,X轴仅展示周数
ggplot(df.demo, aes(x = fct_reorder(as.character(week), ymd(paste(year, week, 1), truncated = 2)), y = y)) + 
  geom_col() +
  labs(x = "周数")

关键说明

  • 直接将week转为因子时,默认会按周数的数值大小排序,因此会出现1-4周在前的问题。
  • 上述两种方法均通过年份+周数的时间逻辑来指定因子水平顺序,既满足行业仅显示周数的需求,又保证了排序符合实际时间先后。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:20:46