如何使用ggplot2的geom_line绘制按星期分组的月度数据折线图?
如何使用ggplot2的geom_line绘制按星期分组的月度数据折线图?
嘿,我懂你的困惑!问题出在你的数据格式上——你现在用的是宽格式(每个月份单独一列),但ggplot2绘制多条折线的时候,更适合用长格式数据。我来一步步帮你搞定:
首先,先把你的数据重现出来(方便后续操作):
# 构造你的数据框 trip_id <- data.frame( day_of_week = c("sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"), feb_23 = c(24575, 32208, 41347, 25792, 21852, 38517, 24284), mar_23 = c(48314, 46043, 56317, 51056, 46027, 69504, 24948), apr_23 = c(83366, 78434, 101060, 61445, 71823, 75012, 73140), may_23 = c(84074, 85285, 76440, 98910, 83957, 131155, 84078), jun_23 = c(116821, 122528, 101694, 94837, 117189, 104023, 130631) )
接下来要把宽格式转成长格式,用tidyr包的pivot_longer函数就很方便:
library(tidyr) library(ggplot2) # 转换成长格式:把所有月份列合并成一列,数值对应到另一列 trip_long <- trip_id %>% pivot_longer( cols = -day_of_week, # 排除星期列,剩下的都是月份列 names_to = "month", # 新的月份列名称 values_to = "value" # 新的数值列名称 )
现在数据格式对了,就可以轻松绘制折线图了:
ggplot(trip_long, aes(x = month, y = value, group = day_of_week, color = day_of_week)) + geom_line(linewidth = 1) + # 设置线宽让折线更明显 geom_point(size = 2) + # 加上数据点,方便查看每个月份的具体数值 labs( title = "各星期几的月度数据趋势", x = "月份", y = "数值", color = "星期几" ) + theme_minimal()
给你解释下这段代码的关键部分:
group = day_of_week:告诉ggplot要按星期几分组,这样每个星期会单独画一条折线color = day_of_week:给不同星期的折线分配不同颜色,一眼就能区分开- 加上
geom_point是可选的,但能让数据点更清晰,方便读取具体数值
你之前直接叠加多个geom_line的方式行不通,因为每个geom_line只对应一列数据,而且没有正确按星期分组,自然出不来你想要的效果。转成长格式后,ggplot就能自动处理分组逻辑啦!
备注:内容来源于stack exchange,提问作者Luan Pereira
相关产品推荐
相关产品推荐

