在 Scale_x_datetime 中使用中断

Using breaks in Scale_x_datetime

我正在尝试绘制 x 轴上限制为 2022-05-29 07:00:00 到 2022-05-29 07:00:00 PM 的图表。在这些限制内,我想要 1 小时的休息时间。我正在使用 scale_x_datetime 以便我可以将其绘制为连续变量而不是离散变量。我创建了一个包含所有中断的向量,称为 axisorder。

c("2022-05-29 07:00:00", "2022-05-29 08:00:00", "2022-05-29 09:00:00", 
"2022-05-29 10:00:00", "2022-05-29 11:00:00", "2022-05-29 12:00:00", 
"2022-05-29 01:00:00", "2022-05-29 02:00:00", "2022-05-29 03:00:00", 
"2022-05-29 04:00:00", "2022-05-29 05:00:00", "2022-05-29 06:00:00", 
"2022-05-29 07:00:00", "2022-05-29 08:00:00")

这是我的数据

structure(list(Id = c("user_6", "user_6", "user_6", "user_6", 
"user_6", "user_6", "user_6", "user_6", "user_6", "user_6", "user_6", 
"user_6", "user_6", "user_6", "user_6", "user_6", "user_6", "user_6", 
"user_6", "user_6", "user_6", "user_6", "user_6", "user_6"), 
    ActivityHour = structure(c(1653825600, 1653786000, 1653789600, 
    1653793200, 1653796800, 1653800400, 1653804000, 1653807600, 
    1653811200, 1653814800, 1653818400, 1653822000, 1653825600, 
    1653786000, 1653789600, 1653793200, 1653796800, 1653800400, 
    1653804000, 1653807600, 1653811200, 1653814800, 1653818400, 
    1653822000), class = c("POSIXct", "POSIXt"), tzone = ""), 
    TotalIntensity = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 28L, 13L, 
    13L, 143L, 20L, 11L, 19L, 54L, 9L, 19L, 24L, 19L, 9L, 0L, 
    0L, 0L, 0L), AverageIntensity = c(0, 0, 0, 0, 0, 0, 0, 0.466667, 
    0.216667, 0.216667, 2.383333, 0.333333, 0.183333, 0.316667, 
    0.9, 0.15, 0.316667, 0.4, 0.316667, 0.15, 0, 0, 0, 0)), row.names = c(NA, 
-24L), class = "data.frame")

最后但同样重要的是我的图表代码

ggplot(data=df2, aes(x = ActivityHour, y = AverageIntensity)) +
  geom_point() +
  geom_line() +
  theme(axis.text.x = element_text(angle = 45)) + 
  scale_x_datetime(breaks = "axisorder"), limits = c(as.POSIXct("2022-05-29 07:00:00"),as.POSIXct("2022-05-29 07:00:00")) +
  ggtitle("Average Intensity user_6",
          subtitle = "4-12-2016")

我只是不明白如何设置 scale_x_datetime 来获得这些限制和突破?我的 x 轴数据已经格式化为 (posixct.)

如有任何帮助,我们将不胜感激!

更新 -- 这是我所在的位置..

我已将我的 df2$ActivityHour 转换为 POSIXct

1653800400, 1653804000, 1653807600, 1653811200, 1653814800, 1653818400, 
1653822000, 1653825600, 1653786000, 1653789600, 1653793200, 1653796800, 
1653800400, 1653804000, 1653807600, 1653811200, 1653814800, 1653818400, 
1653822000), class = c("POSIXct", "POSIXt"), tzone = "")

然后我更新了 date_breaks = "hour" 并更改了我的限制 limits = c(as.POSIXct("2022-05-29 07:00:00"), as.POSIXct ("...))

我的新剧情数据是这样的

  ggplot(data=df2, aes(x = ActivityHour, y = AverageIntensity)) +
  geom_point() +
  geom_line() +
  theme(axis.text.x = element_text(angle = 45)) + 
  scale_x_datetime(date_breaks = "hour", limits = c(as.POSIXct("2022-05-29 07:00:00"),as.POSIXct("2022-05-29 19:00:00"))) +
  ggtitle("Average Intensity user_6",
          subtitle = "4-12-2016")

我的情节很奇怪,好像 df2$AverageIntensity 没有用 $ActivityHour 值正确绘制值。例如,13:00:00 不再与 .31 的平均强度相关,而是没有数据。我理解这是因为 12:00:00 之后的 df2$ActivityHour 值应该是 13:00:00、14:00:00、15:00:00 等而不是 01:00:00。所以我正在寻找解决此问题的最快方法?

UPDATE2 -- 我用替换函数修复了这个问题

df2$ActivityHour <- replace(df2$ActivityHour,1,"2022-05-29 00:00:00")

然后为每个位置替换。

语法:替换(列表,位置,replacement_value)

你有几个问题。

首先,您的 axisorder 是字符格式,而不是所需的 POSIXct。其次,您已将“axisorder”放在引号中,因此 ggplot 认为您希望在名为 "axisorder" 的位置进行一次中断。无论如何,您实际上并不需要 axisorder,因为正如 Stefan 指出的那样,您可以使用 date_breaks = "hour"

第三,也是最重要的一点,您需要使用 24 小时制时间格式,因此您的第二个限制应该是“2022-05-29 19:00:00”。对于数据框中的所有时间也是如此。中午之后的时间需要增加 12 小时(午夜的初始值需要删除 12 小时):

df2$ActivityHour[14:24] <- df2$ActivityHour[14:24] + 12 * 3600
df2$ActivityHour[1] <- df2$ActivityHour[1] - 12 * 3600

ggplot(data=df2, aes(x = ActivityHour, y = AverageIntensity)) +
  geom_point() +
  geom_line() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  scale_x_datetime(date_breaks = "hour",
                   limits = c(as.POSIXct("2022-05-29 07:00:00"),
                              as.POSIXct("2022-05-29 19:00:00"))) +
  ggtitle("Average Intensity user_6", subtitle = "4-12-2016")