如何在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
相关产品推荐
相关产品推荐

