使用geom_point绘制datetime数据时点偏移至每日0点的问题求助
问题原因与修复方案
哈哈,这个坑我之前也踩过!咱们一点点拆解问题:
为啥geom_point会对齐到00:00?
核心原因是你用错了x轴的刻度函数:你的time_stamp是带时分秒的日期时间类型(POSIXct/POSIXlt),但你用了只适用于纯日期(不带时间)的scale_x_date()。这个函数会自动把POSIXct类型的时间截断成当日00:00,直接丢掉时分秒信息,所以所有点都被拉到了每天的零点位置。
至于你说geom_line看起来正常,其实是个错觉——或者更可能是你写错了参数:geom_line()根本没有method参数,这个参数是给拟合趋势线的geom_smooth()用的,你写的geom_line(method='lm')其实会被ggplot忽略,它还是在按原始时间点连线,但x轴被scale_x_date()改得面目全非了,所以视觉上好像位置对,但实际逻辑是错的。
怎么修复?
我给你整理了完整的修正步骤:
替换刻度函数:把
scale_x_date()换成专门处理日期时间的scale_x_datetime(),同时保留你想要的小时刻度和标签:# 记得先加载scales包,不然date_format用不了 library(scales) scale_x_datetime(labels = date_format("%H:%M"), breaks = "1 hour")修正geom的参数错误:
- 如果想画线性拟合的趋势线:把
geom_line(method='lm')改成geom_smooth(method='lm', se=FALSE)(se=FALSE可以去掉默认的置信区间,只留趋势线); - 如果只是想把原始数据点连起来:直接用
geom_line()就行,不需要加method参数。
- 如果想画线性拟合的趋势线:把
规范aes映射的写法:新版本ggplot2推荐直接用变量名,别加引号,这样代码更清晰也不容易出问题:
ggplot(aes(y=metric, x=time_stamp, color=type), data = tmp_df)
完整的修正代码
library(ggplot2) library(scales) # 先确保day列是正确提取的(从time_stamp转成纯日期) tmp_df$day <- as.Date(tmp_df$time_stamp) # 绘图代码 s <- ggplot(aes(y=metric, x=time_stamp, color=type), data = tmp_df) + geom_point() + geom_smooth(method='lm', se=FALSE) + # 换成geom_line()如果只是连点 facet_grid(day ~ ., scales='free_x') + scale_x_datetime(labels = date_format("%H:%M"), breaks = "1 hour")
这样修改后,geom_point就会正确显示在原始的时间点位置,分面和刻度也能正常工作啦!
内容的提问来源于stack exchange,提问作者LearningSlowly
相关产品推荐
相关产品推荐

