如何正确设置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
相关产品推荐
相关产品推荐

