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

如何在RStudio中按从早到晚顺序绘制带AM/PM的时间轴

解决X轴时间排序问题

你的问题根源在于activityhourampm是字符型变量,ggplot默认按字符串的字典序排序,所以会出现1AM、10AM、1PM这类不符合时间逻辑的顺序。不需要强制转换为24小时制,以下两种方法都能解决:

方法一:转换为时间类型(推荐)

将字符型时间转换为专门的时间格式,ggplot会自动按时间先后排序,同时还能保留AM/PM的显示格式:

library(lubridate)
library(dplyr)
library(ggplot2)

# 把字符串时间解析为时间类型
CaloriesNew1 <- CaloriesNew1 %>%
  mutate(activity_time = parse_time(activityhourampm))

# 绘图时使用转换后的时间列,并用scale_x_time指定标签格式
CaloriesNew1 %>% 
  ggplot(aes(x = activity_time, y = calories)) +
  geom_point() +
  scale_x_time(labels = function(x) format(x, "%I:%M:%S %p")) + # 保持AM/PM显示
  theme(axis.text.x = element_text(angle = 45))

方法二:转换为有序因子

手动指定时间的正确顺序,把列转为有序因子,ggplot会按照你设定的顺序排列X轴:

library(dplyr)
library(ggplot2)

# 生成从12AM到11PM的正确时间顺序列表
time_order <- c(
  "12:00:00 AM", "1:00:00 AM", "2:00:00 AM", "3:00:00 AM", "4:00:00 AM", 
  "5:00:00 AM", "6:00:00 AM", "7:00:00 AM", "8:00:00 AM", "9:00:00 AM", 
  "10:00:00 AM", "11:00:00 AM", "12:00:00 PM", "1:00:00 PM", "2:00:00 PM", 
  "3:00:00 PM", "4:00:00 PM", "5:00:00 PM", "6:00:00 PM", "7:00:00 PM", 
  "8:00:00 PM", "9:00:00 PM", "10:00:00 PM", "11:00:00 PM"
)

# 转换为有序因子
CaloriesNew1 <- CaloriesNew1 %>%
  mutate(activityhourampm = factor(activityhourampm, levels = time_order, ordered = TRUE))

# 重新绘图
CaloriesNew1 %>% 
  ggplot(aes(x = activityhourampm, y = calories)) +
  geom_point() +
  theme(axis.text.x = element_text(angle = 45))

若需要转换为24小时制

如果确实需要24小时制的时间列,可以用以下代码转换,转换后的列同样能正常排序:

library(lubridate)
library(dplyr)

CaloriesNew1 <- CaloriesNew1 %>%
  mutate(
    activity_time = parse_time(activityhourampm),
    activityhour_24 = format(activity_time, "%H:%M:%S") # 转为24小时制字符串
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:55:34