如何使用ggplot绘制仅显示时间(不含日期)且按工作日分别展示的CO2浓度折线图
解决方案:拆分日期与时间,按工作日分组绘图
要实现「x轴仅显示时间、每个工作日对应一条折线」的需求,我们需要对数据做简单的拆分处理,再调整ggplot的分组逻辑。以下是完整的修改步骤和代码:
步骤1:加载依赖包并预处理数据
首先我们需要把dateTime拆分为工作日(日期)和当日时间两个独立字段,这样就能用工作日来区分不同折线,用当日时间作为x轴。这里我们用lubridate和hms包来更便捷地处理时间数据:
# 加载必要的包 library(tidyverse) library(lubridate) library(hms) # 预处理数据:拆分日期和时间 co2data <- co2data %>% mutate( dateTime = as.POSIXct(dateTime), workday = as.factor(date(dateTime)), # 提取工作日作为分组依据 time_of_day = as_hms(dateTime) # 提取当日时间(仅保留时/分/秒,无日期) )
步骤2:绘制分组折线图
在ggplot中,我们通过group = workday指定按工作日分组,同时用color = workday让不同工作日的折线显示不同颜色,x轴使用我们提取的time_of_day,并设置x轴仅显示时间格式:
co2data %>% ggplot(aes(x = time_of_day, y = ppm, group = workday, color = workday)) + geom_line(linewidth = 1) + # 设置折线粗细,提升可读性 labs( title = "CO2 Concentration During Work Hours", y = "CO2 Concentration (ppm)", x = "Time of Day", color = "Workday" # 图例标题 ) + theme_minimal() + scale_x_time( labels = scales::time_format("%H:%M"), # x轴仅显示小时:分钟 breaks = co2data$time_of_day # 每个采集时间点都显示刻度 )
代码逻辑说明
- 拆分
dateTime为workday和time_of_day:解决了原代码中x轴包含日期、无法区分工作日折线的问题。 group = workday:告诉ggplot每个工作日的数据要单独绘制一条折线。scale_x_time():强制x轴按时间格式渲染,并且只显示小时和分钟,完全隐藏日期信息。
如果不需要额外安装hms包,也可以用format(dateTime, "%H:%M")把时间转为字符串作为x轴,但用as_hms()的优势是x轴会作为连续变量处理,刻度排列更符合时间的逻辑顺序。
内容的提问来源于stack exchange,提问作者D. Studer
相关产品推荐
相关产品推荐

