将日期时间格式的刻度标签编辑为 ggplot2 中的短版本

Editing tick labels in datetime format to short version in ggplot2

有谁知道 function/package 只显示轴中显示的一天中第一个小时的日期?即,我只想显示 23:30 和 00:00 的日期,因为它们分别是 7 月 21 日和 7 月 22 日的第一个日期。

我使用 ggplot 并设置 scale_x_datetime 如下:

scale_x_datetime(limits = c(ymd_hm('2020-07-21 23:24',
tz = tz_EDT),ymd_hm('2020-07-22 00:25',tz = tz_EDT)), 
date_breaks = '10 mins',date_labels = '%H:%M\n%b/%d',expand = c(0, 0))

我尝试了 scales 包中的 label_date_short,但我个人不喜欢这种格式。我只想分隔时间和日期(day/month/year 或 year/month/day),而不是时间、日期、月份和去年。

对于上图,代码如下:

scale_x_datetime(limits = c(ymd_hm('2020-07-21 23:25',
tz = tz_EDT),ymd_hm('2020-07-22 00:25',tz = tz_EDT)),
date_breaks = '10 mins',labels = label_date_short(),expand = c(0, 0))

我的理解是 R 不能很好地处理 time 数据,而是更喜欢 datetime 数据。这是有道理的,因为每天重复相同的时间,而不应重复日期时间,因此您不太可能重复时间数据点。

无论如何,转到您的示例,您可以手动指定要在 x-axis 上显示的 2 个值。您需要以日期时间格式指定它们,然后指定它们显示的格式(即 YYYMMDD、YYMMDD-HHMM、HHMM 等)。

我建议使用 lubridate 包来处理日期和(日期)时间,如果您不熟悉请查看 ?lubridate,尤其是我们在此示例中使用的函数:?ymd_hm.基本上,ymd_hm() 将拼写为“year-month-day hour-minute”的字符转换为日期时间对象。日期时间对象打印为 'year-month-day hour:min:sec',即使我们没有指定任何 'seconds' 数据 - 不用担心,因为默认情况下秒为零(即分钟的顶部)。

我制作了一些示例数据,包括您的日期时间范围:

library(tidyverse) # for the tibble() and pipes (%>%) functions 
library(lubridate)

tibble(
  datetime = seq(ymd_hm('2020-07-21 23:24'), ymd_hm('2020-07-22 00:25'), 'min'), # sample datetime sequence, with 1 min intervals
  value = rnorm(62, 1, 1) # random data
) %>%
  {. ->> my_data}

然后,当您构建 ggplot 时,您将使用 scale_x_datetime 并手动指定 breaksbreaks 需要采用日期时间格式,因此我们再次使用 ymd_hm()。我们在这里指定完整的日期时间。然后,您可以使用 date_labels 指定要在 中显示的轴标签格式 。这是我们告诉 scale_x_datetime 仅显示 小时和分钟的地方,使用 %H:%M 符号(请参阅 https://www.stat.berkeley.edu/~s133/dates.html 以获取日期和时间格式列表).

my_data %>%
  ggplot(aes(datetime, value))+
  geom_line()+
  scale_x_datetime(
    breaks = c(ymd_hm(c('2020-07-21 23:30', '2020-07-22 00:00'))),
    date_labels = '%H:%M'
    )

注意:刻度线的位置始终是日期时间格式,但它们的标记方式可以更改。例如,您可以 re-label 时间指向一个字符向量,例如:

my_data %>%
  ggplot(aes(datetime, value))+
  geom_line()+
  scale_x_datetime(
    breaks = c(ymd_hm(c('2020-07-21 23:30', '2020-07-22 00:00'))),
    # date_labels = '%H:%M'
    date_labels = c('t1', 't2')
    )