【发布时间】:2017-06-26 11:53:34
【问题描述】:
考虑以下示例
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)
这种方法有两个问题
- 显然,R 不理解 x 轴具有时间含义。这只是一个字符向量。
- 因此,我无法使用
scale_x_discrete(breaks= scales::pretty_breaks(n = 10)有效地控制 x 轴。这是一个大问题,因为我的数据在一整天内以分钟的频率出现。 x 轴上的标签太多了。
有人可以在这里做得更好吗?是否可以在 x 轴上保留某种时间变量,即使没有与这些时间相关联的特定日期?
谢谢!
【问题讨论】:
-
scale_x_date 呢?
-
"很明显,R不明白x轴有时间意义" 如果你把它放在POSIX类中并使用
scale_x_datetimeggplot2就会明白时间很好的意思。当您使用strftime仅提取小时时,就会出现问题。 -
恶搞它。重新添加日期信息,并在同一天完成。
-
@Gregor 我认为挑战在于绘制一个 x 轴仅显示一天中的小时数(而不是假日期)的图。
-
标题不好。 “当 x 变量是字符时,如何标记时间序列图的 x 轴?”是一个 XY 问题。真正的潜在问题是“如何使 TS 绘图的 x/时间轴仅显示时间分量,而不是日期”。 (“我应该将时间提取为角色吗?” 会详细说明)