考虑以下示例
library(lubridate)
library(tidyverse)
library(scales)
library(ggplot2)
dataframe <- data_frame(time = c(ymd_hms('2008-01-04 00:00:00'),
ymd_hms('2008-01-04 00:01:00'),
ymd_hms('2008-01-04 00:02:00'),
ymd_hms('2008-01-04 00:03:00'),
ymd_hms('2008-01-05 00:00:00'),
ymd_hms('2008-01-06 00:01:00'),
ymd_hms('2008-01-07 00:02:00'),
ymd_hms('2008-01-08 00:03:00')),
value = c(1,2,3,4,5,6,7,8))
# A tibble: 8 × 2
time value
<dttm> <dbl>
1 2008-01-03 19:00:00 1
2 2008-01-03 19:01:00 2
3 2008-01-03 19:02:00 3
4 2008-01-03 19:03:00 4
5 2008-01-04 19:00:00 5
6 2008-01-05 19:01:00 6
7 2008-01-06 19:02:00 7
8 2008-01-07 19:03:00 8
我需要做的很简单:我需要在样本的所有日子里计算value
在同一小时 - 秒 - 的平均值,并绘制它。
我做了以下事情:
dataframe <- dataframe %>%
mutate(hour = strftime(time, format="%H:%M:%S")) %>%
group_by(hour) %>%
summarize(mean = mean(value)) %>%
ungroup()
> dataframe
# A tibble: 4 × 2
hour mean
<chr> <dbl>
1 19:00:00 3
2 19:01:00 4
3 19:02:00 5
4 19:03:00 6
ggplot(dataframe, aes(x = hour, y = mean, group = 1)) +
geom_line(size = 2)
这种方法有两个问题
scale_x_discrete(breaks= scales::pretty_breaks(n = 10)
有效控制x轴。这是一个很大的问题,因为我的数据是一整天的微小频率。 x轴上的标签太多了。有人可以在这里做得更好吗?是否有可能在x轴上保留某种时间变量,即使没有与这些时间相关的特定日期?
谢谢!
答案 0 :(得分:1)
我们只需要一个POSIX日期时间,所有小时都具有相同的日期。日期并不重要,选择任何你喜欢的:
dataframe <- dataframe %>%
mutate(hour = strftime(time, format="%H:%M:%S")) %>%
group_by(hour) %>%
summarize(mean = mean(value)) %>%
# add the date back in
mutate(x_date = ymd_hms(paste("2008-01-01", hour))) %>%
ungroup()
ggplot(dataframe, aes(x = x_date, y = mean, group = 1)) +
geom_line(size = 2)
就像1到10之间的数字默认不标记为001,002,003等一样,同一天的日期时间默认情况下不会标记日期和时间。可以在scale_x_datetime
。