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

在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后再指定只显示时分:

  1. 数据处理阶段转换时间格式:
# 给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)
  1. 修改绘图代码:
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类型的数值特性,手动指定刻度位置和对应的时分标签:

  1. 先获取聚合后的数据:
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)
  1. 提取唯一时间值和对应的时分标签:
unique_times <- unique(agg_df$rounded_eating_time)
time_labels <- as.character(unique_times)
  1. 绘图时指定自定义刻度:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:56:03