在R语言Plotly中格式化X轴的小时与分钟
Plotly R 中chron时间类型X轴显示时分格式的解决方案
问题描述
我是Plotly新手,在绘图格式设置上遇到问题:已将数据框中的时间字段转为chron类型,按星期和半小时增量分组计算平均糖分摄入量后,使用Plotly绘图时,X轴显示为0-1的日占比小数,希望其显示为rounded_eating_time列中的时分格式,尝试过tickmode='array'但无效。
相关数据处理代码:
df$time_of_eating_occasion_hhmm <- chron(times = df$time_of_eating_occasion_hhmm) df$rounded_eating_time <- round(df$time_of_eating_occasion_hhmm, "01:00:00") df %>% select(intake_day_of_the_week, intake_day_cat, time_of_eating_occasion_hhmm, rounded_eating_time, total_sugars_gm) %>% group_by(intake_day_cat, rounded_eating_time) %>% summarize(m = mean(total_sugars_gm)) %>% arrange(match(intake_day_cat, c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")), rounded_eating_time)
原绘图代码:
plot_ly(x = ~rounded_eating_time, y = ~m) %>% add_lines(color = ~intake_day_cat) %>% layout( xaxis = list( type = 'time', tickformat = "%H:%M:%S" ))
解决方法
方法一:将chron时间转为Plotly兼容的POSIXct格式
Plotly的type='date'轴能很好识别POSIXct类型的时间戳,我们可以给chron时间附加一个固定日期,转换为POSIXct后再指定只显示时分:
- 数据处理阶段转换时间格式:
# 给chron时间附加固定日期,转为POSIXct类型 df$rounded_eating_time_posix <- as.POSIXct(paste("2024-01-01", as.character(df$rounded_eating_time))) # 保持原分组聚合逻辑 agg_df <- df %>% select(intake_day_cat, rounded_eating_time_posix, total_sugars_gm) %>% group_by(intake_day_cat, rounded_eating_time_posix) %>% summarize(m = mean(total_sugars_gm)) %>% arrange(match(intake_day_cat, c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")), rounded_eating_time_posix)
- 修改绘图代码:
plot_ly(data = agg_df, x = ~rounded_eating_time_posix, y = ~m) %>% add_lines(color = ~intake_day_cat) %>% layout( xaxis = list( type = 'date', tickformat = "%H:%M", # 自定义显示时分格式 ticklabelmode = "period" ) )
方法二:手动指定自定义刻度数组
如果不想转换时间类型,可以直接利用chron类型的数值特性,手动指定刻度位置和对应的时分标签:
- 先获取聚合后的数据:
agg_df <- df %>% select(intake_day_cat, rounded_eating_time, total_sugars_gm) %>% group_by(intake_day_cat, rounded_eating_time) %>% summarize(m = mean(total_sugars_gm)) %>% arrange(match(intake_day_cat, c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")), rounded_eating_time)
- 提取唯一时间值和对应的时分标签:
unique_times <- unique(agg_df$rounded_eating_time) time_labels <- as.character(unique_times)
- 绘图时指定自定义刻度:
plot_ly(data = agg_df, x = ~rounded_eating_time, y = ~m) %>% add_lines(color = ~intake_day_cat) %>% layout( xaxis = list( tickmode = 'array', tickvals = unique_times, # 刻度位置匹配chron类型的数值 ticktext = time_labels, # 显示时分格式的标签 tickangle = 45 # 可选,倾斜标签避免重叠 ) )
注:之前
tickmode='array'无效的原因是tickvals没有匹配chron类型的数值(0-1的小数),直接使用唯一的chron值作为tickvals即可正确对应。
内容的提问来源于stack exchange,提问作者flemm0
相关产品推荐
相关产品推荐

