在绘制时间序列的因子值时,如何在ggplot中设置自己的刻度标签?

时间:2019-07-11 17:12:49

标签: r ggplot2

因此,我正在ggplot中绘制一些时间序列,并在x轴上获得了一些日期/时间数据。 2008年至2016年的数据。问题在于日期不是连续的,例如2008年的最后一个日期是

2008/05/14 19:05:12

下一个日期是2009年,像这样

2009/03/24 10:17:54

在绘制这些图形时,结果如下

enter image description here

为了摆脱空白,我将日期变成因素 dates <- factors(dates)以获取正确的图。 enter image description here 但是之后,由于

不变,我无法设置x刻度标签

scale_x_continuous(breaks = c(1,1724,2283,5821,8906,10112,10156,14875 ), labels = c("2008","2009","2010","2011","2012","2013","2014","2015"))

如何更改它们?

1 个答案:

答案 0 :(得分:1)

这会引发一些问题,解决方案实际上取决于您要查找的内容。我建议您到目前为止发布一些示例数据和代码,以获得更精确的答案,但是与此同时这是有可能的:

您的上图没有显示连续的刻度(尽管看起来像),而是一个离散的刻度,其级别数对应于唯一的日期观测值。由此产生两个问题:

  • 应用scale_x_continuous不会成功,因为年假不会平均分布
  • 您的数据看起来像是在顺利传播,但事实并非如此,这不是可视化的好原则。

如果您要显示的是逐年变化,则可以将所有数据分类到每年的“箱”中并绘制:

library(tidyverse)
library(lubridate)

# creating random data

df <- tibble(date = as_datetime(runif(1000, as.numeric(as_datetime("2001/01/24 09:30:43")), as.numeric(as_datetime("2006/02/24 09:30:43")))))

df["val"] <- rnorm(nrow(df), 25, 5)

# use lubridate to extract year as new variable, and plot grouped years
df %>%
  mutate(year = factor(year(date))) %>% 
  ggplot(aes(year, val)) +
  geom_point(position = "jitter")

enter image description here

另一种可能是使用色标来按年份记录您的分组,保持所有日期井然有序,但要消除差距(因此不使用连续的x轴标尺):

df %>%  # begin by simulating a data 'gap'
  filter(date>as_datetime("2003/07/24 09:30:43")|date<as_datetime("2002/09/24 09:30:43")) %>% 
  mutate(year = factor(year(date)),  # 'year' to select colour
         date = factor(date)) %>% 
  ggplot(aes(date, val, col = year)) +
  geom_point() +
  theme(axis.ticks.x = element_blank(),  # removes all ticks and labels, as too many unique times
        axis.text.x = element_blank())

enter image description here

如果上述两种方法都没有帮助,请在下面评论您所要寻找的任何内容,我会帮忙的!

编辑:最后一个想法,您可以创建一系列看不见的点,作为轴刻度的中断点:

blank_labels <- tibble(date = as_datetime(c("20020101 000000",
                                          "20030101 000000",
                                          "20040101 000000",
                                          "20050101 000000",
                                          "20060101 000000")),
                       col = "NA", val = 0)

df2 <- df %>%
  filter(date>as_datetime("2003/07/24 09:30:43")|date<as_datetime("2002/09/24 09:30:43")) %>% 
  mutate(col = "black") %>% 
  bind_rows(blank_labels) %>% 
  mutate(date_fac = factor(date)) 

tick_values <- left_join(blank_labels, df2, by = c("date", "col"))

df2 %>% 
  ggplot(aes(date_fac, val, col = col)) +
  geom_point() +
  scale_x_discrete(breaks = tick_values$date_fac, labels = c("2002", "2003", "2004", "2005", "2006")) +
  scale_color_identity()

enter image description here