You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ggplot将chron包的时间以hh:mm格式绘图?

解决ggplot中chron时间轴显示为日分数的问题

首先得明确:chron包的times类型本质是一天的分数值(0代表00:00:00,1代表24:00:00),所以ggplot会把它当成连续数值处理,导致X轴显示0-1。下面给你两种实用的解决办法:

方法1:自定义连续轴的刻度与标签

不需要转换数据类型,直接在ggplot里用scale_x_continuous手动设置刻度和对应的时间格式标签:

library(ggplot2)
library(chron)

# 在你的原始绘图代码基础上修改
ggplot(x, aes(x = Time, y = Sum_C.Total)) +
  geom_point() +
  scale_x_continuous(
    # 设置刻度:每1小时一个刻度(1/24是一天的1小时占比)
    breaks = seq(0, 1, by = 1/24),
    # 把日分数转成hh:mm格式的标签
    labels = function(x) times(x) %>% format("%H:%M")
  ) +
  labs(x = "时间")

如果需要更细的刻度(比如每15分钟),把by改成1/(24*4)即可;想要显示秒数的话,把标签格式换成"%H:%M:%S"就行。

方法2:将chron时间转换为ggplot可识别的时间类型

把chron的times转成hms包的时间对象,或者POSIXct类型,这样ggplot会自动识别为时间轴,不用手动设置刻度:

用hms包转换

library(ggplot2)
library(chron)
library(hms)

# 将chron times转成hms对象
x$time_hms <- as.hms(x$Time)

# 直接绘图,ggplot会自动处理时间刻度
ggplot(x, aes(x = time_hms, y = Sum_C.Total)) +
  geom_point() +
  labs(x = "时间")

用POSIXct转换

library(ggplot2)
library(chron)

# 转成POSIXct(需要指定一个日期原点,这里选一个不影响的固定日期即可)
x$time_posix <- as.POSIXct(x$Time, origin = "2020-01-01")

# 绘图并设置时间显示格式
ggplot(x, aes(x = time_posix, y = Sum_C.Total)) +
  geom_point() +
  scale_x_datetime(labels = scales::date_format("%H:%M:%S")) +
  labs(x = "时间")

为什么你之前的方案没生效?

你提到的"%02d:00"格式不适用,是因为那个方案是针对“小时数”数值的格式化,而chron的时间是日分数,不是直接的小时数。比如1小时对应的日分数是1/24≈0.0417,直接用%d格式化会得到0,所以才会出问题。上面的两种方法都避开了这个问题,直接基于chron的时间转换逻辑来处理。


内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:12:49