在 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")
我正在尝试绘制 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")