将日期时间格式的刻度标签编辑为 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
并手动指定 breaks
。 breaks
需要采用日期时间格式,因此我们再次使用 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')
)
有谁知道 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
并手动指定 breaks
。 breaks
需要采用日期时间格式,因此我们再次使用 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')
)