如何在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
相关产品推荐
相关产品推荐

