如何用ggplot绘制含非数值标签、时间戳差异的两个时间序列数据框?
问题解决思路及代码
错误原因
报错Error: Discrete value supplied to continuous scale的根本原因不是两个数据框的timeStamp不匹配,而是你在geom_text中把离散的文本值(a/b/c)直接赋值给了连续型y轴,ggplot无法将离散值映射到连续刻度上。
修正方案
要实现将df2的标签标注在x轴对应时间位置的效果,只需给geom_text指定一个固定的连续型y值(比如x轴下方的某个位置),同时用label参数指定要显示的文本内容即可:
完整代码
library(ggplot2) # 定义数据框 df1 <- setNames(data.frame(c(as.POSIXct("2022-07-29 00:00:00","2022-07-29 00:05:00","2022-07-29 00:10:00","2022-07-29 00:15:00","2022-07-29 00:20:00")), c(1,2,3,4,5)), c("timeStamp", "value")) df2 <- setNames(data.frame(c(as.POSIXct("2022-07-29 00:00:05","2022-07-29 00:05:05","2022-07-29 00:20:05")), c("a","b","c")), c("timeStamp", "text")) # 绘图 ggplot() + geom_point(data=df1, aes(x=timeStamp, y= value)) + # 指定固定y值放置标签,vjust控制标签与x轴的距离 geom_text(data=df2, aes(x=timeStamp, y= 0, label = text), vjust = 1.5) + # 扩展y轴范围,避免标签被截断 ylim(-0.5, max(df1$value) + 0.5)
额外调整说明
- 如果想让标签更靠近x轴,可以修改
vjust的值(比如设为1.2); - 若希望标签放在主图数据点的附近(而非x轴下方),可以将
y值设为对应时间点附近的数值(比如y=0.8); - 若需要更精准地对齐df2的时间与df1的数值,可以用
dplyr::left_join结合zoo::na.locf等方法匹配最近的value,但针对你要的示例效果,上述代码已足够。
内容的提问来源于stack exchange,提问作者ambergris
相关产品推荐
相关产品推荐

