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

如何正确设置ggplot的x轴刻度?周时间序列刻度错乱问题求解

问题根因
  • 你对melt后的长表直接筛选刻度:长表中每个周对应2行(对应两个count变量),你用c(T,F,F,F,F,F,F,F,F)筛选的是行而非独立周,导致取到的刻度逻辑完全错误,自然出现间距不均、顺序混乱的问题
  • 字符类型的iso_week直接作为x轴输入时,ggplot会默认按字典序排序,若数据的因子顺序未对齐实际时间顺序,就会出现跨年时顺序错乱
修正方案

首先优化冗余的数据处理逻辑,同时将iso_week设为有序因子,水平和实际时间顺序完全对齐;选刻度时直接从去重后的周列表中每8个取1个即可。

完整可运行代码
library(ggplot2)
library(reshape2)
library(dplyr)

# 原始数据生成
iso_week <- c(paste("2020", "KW", 11:53, sep = "_"),
              paste("2021", "KW", 1:23, sep = "_"))

count_Test <- c(129291,  374534 , 377599 , 417646 , 386241, 339983 , 363659 , 327799,  385638 , 431682  ,356489  ,408078,
                342328 , 327980,  384834 , 472823 , 512969 , 513572,  544219,  556634 , 589201 , 719476 , 871191 ,1034449,
                1133623 ,1052942 ,1148465, 1147879 ,1220279 ,1129127 ,1218988, 1284349, 1445463 ,1663992 ,1634729 ,1467454,
                1400145, 1381117, 1395790, 1516038, 1672033, 1090372 , 845729, 1231405, 1187564, 1113690, 1151633, 1101499,
                1060602, 1103231, 1171798, 1153270 ,1280050 ,1367247 , 1416888, 1178378, 1169510 ,1312602 ,1427668, 1360960,
                1255724, 1100259 ,1218879,  944376,  874665 ,822977)

count_Test2 <- c(24899 , 34853 , 28920 , 25168 , 18262 , 11915  , 8546,   6156  , 4969,   4084  , 3156 ,  2642 ,  2358,   2755,
                 4370 ,  2875 ,  2543 ,  2656  , 3625 ,  4717 ,  5579,   7159,   9073  , 8734  , 8292 ,  9165 , 11154  ,12533,
                 14486 , 21373 , 35631 , 61856, 105667, 122036, 120862 ,124172, 121464, 116050, 145687, 171481, 167404, 127912,
                 120452, 115805,  97104 , 85557  ,69442  ,56902, 49898 , 54642,  55667, 63029  ,82489, 104623, 118021, 111505,
                 129105, 139658 ,136057 ,109776 , 85240 , 59051 , 39067,  25476 , 17094 , 10168)

# 简化数据处理逻辑,直接生成数据框,避免冗余转换打乱顺序
testData <- data.frame(
  iso_week = factor(iso_week, levels = iso_week, ordered = TRUE),
  count_Test = count_Test,
  count_Test2 = count_Test2
)

# 转换长表
meltdf <- testData %>% 
  select(count_Test, count_Test2, iso_week) %>%
  melt(id = "iso_week")

# 生成每8周一个的刻度:从去重的周列表里每隔8个取1个
break_weeks <- unique(meltdf$iso_week)[seq(1, length(unique(meltdf$iso_week)), 8)]

# 绘图
k <- ggplot(data = meltdf, 
            aes(x = iso_week, y = value, fill = variable)) + 
  geom_bar(stat = 'identity') +
  scale_x_discrete(breaks = break_weeks)  +
  theme_bw() + 
  theme(panel.border = element_blank(), axis.text.x = element_text(angle = 45, hjust = 1)) # 可选保留x轴标签旋转参数,避免标签重叠
k

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:15:03