【问题标题】:ggplot: How to make the x/time-axis of a time-series plot only the time-component, not the date?ggplot:如何使时间序列的 x/时间轴仅绘制时间分量,而不是日期?
【发布时间】: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) 

这种方法有两个问题

  1. 显然,R 不理解 x 轴具有时间含义。这只是一个字符向量。
  2. 因此,我无法使用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/时间轴仅显示时间分量,而不是日期”。 (“我应该将时间提取为角色吗?” 会详细说明)

标签: r ggplot2 dplyr lubridate


【解决方案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中修改默认值。

【讨论】:

  • 谢谢,但实际上考虑到我的时间从早上的00:00 到一天结束的23:59,我确实看到我的假日期出现在我的 x 轴上。任何想法如何摆脱它?
  • 遵循?scale_x_datetime底部的示例。文档其实挺好的。
  • labels = date_format("%H:%M") 当然!!感谢@Gregor 的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2020-07-01
  • 2021-05-18
  • 1970-01-01
相关资源
最近更新 更多