如何在R中按时间顺序绘制跨年度周数据,避免X轴出现间隔
问题原因
你当前的代码将week列直接作为数值型变量映射到X轴,ggplot会按照数值大小自动排序,2021年的1-3周数值远小于2020年的52、53周,会被排在X轴左侧,因此出现了大面积空白、时间顺序错乱的问题。同时你原有代码里arrange(desc(week))是按周数降序排序,反而会打乱时间顺序,需要先修正排序逻辑。
解决方案
方案1:构造有序分类变量作为X轴
将年份和周数拼接为唯一的时间标识,转成按时间顺序排列的有序因子后映射到X轴即可:
library(dplyr) library(ggplot2) # 数据预处理 per_week <- per_week %>% # 按年份升序、周数升序排序,保证时间顺序正确 arrange(year, week) %>% # 构造自定义周标签,转成有序因子,顺序和数据顺序一致 mutate(week_label = factor(paste0(year, "年第", week, "周"), levels = unique(paste0(year, "年第", week, "周")))) # 绘图 ggplot(per_week, mapping = aes(x = week_label, y = politicalization_sum, group = 1)) + geom_point() + geom_smooth()
注意:必须添加group=1参数,因为X轴为分类变量时,ggplot默认不会把不同分类的点归为同一组拟合线条。
方案2:转换为日期类型(更适合时间序列场景)
借助lubridate包将年+周转换为实际日期,映射到X轴后ggplot会自动按时间顺序排列,适配后续时间维度的扩展需求:
library(dplyr) library(ggplot2) library(lubridate) # 数据预处理 per_week <- per_week %>% arrange(year, week) %>% # 生成每周对应日期,%U默认以周日为一周起始,若需以周一为起始可替换为%V mutate(week_date = ymd(paste(year, 1, 1, sep = "-")) + weeks(week - 1)) # 绘图 ggplot(per_week, mapping = aes(x = week_date, y = politicalization_sum)) + geom_point() + geom_smooth() + # 自定义X轴标签为年+周格式 scale_x_date(date_labels = "%Y年第%U周")
内容的提问来源于stack exchange,提问作者Renée
相关产品推荐
相关产品推荐

