Удалить связь между временными рядами и добавить второстепенную дату на x_axis в ggplot

#r #date #ggplot2

#r #Дата #ggplot2

Вопрос:

Я пытался построить временной ряд, состоящий из средних значений за неделю. Вот график, который я получил:

[средние значения за неделю A] [1]: https://i.stack.imgur.com/XMGMs.png

Как вы можете видеть, временные ряды не охватывают все годы полностью, поэтому, когда у меня нет ggplot ссылок на данные за два последующих года. Я думаю, что мне нужно каким-то образом сгруппировать данные, но я не понимаю, как. Вот код:

 df4 <- data.frame(df$Date, df$A)
colnames(df4)<- c("date","A")
df4$date <- as.Date(df4$date,"%Y/%m/%d")
df4$week_day <- as.numeric(format(df4$date, format='%w'))
df4$endofweek <- df4$date   (6 - df4$week_day)

week_aveA <- df4 %>%
  group_by(endofweek) %>%
  summarise_all(list(mean=mean), na.rm=TRUE) %>%
  na.omit()

g1 = ggplot()   
  geom_step(data=week_aveA, aes(group = 1, x = (endofweek), y = (A_mean)), colour="gray25")  
  scale_y_continuous(expand = c(0, 0), limits = c(0, 2500))   
  scale_x_date(breaks="year", labels=date_format("%Y"))  
  labs(y = expression(A~ ~index), 
       x = NULL)  
  theme(axis.text.x = element_text(size=10), 
        axis.title = element_text(size=10))
  

Здесь извлечение (за предыдущие три года) набора данных:

     endofweek   date_mean   A_mean  week_day_mean
1   20/03/2010  17/03/2010  939,2533437 3
2   27/03/2010  24/03/2010  867,3620121 3
3   03/04/2010  31/03/2010  1426,791222 3
4   10/04/2010  07/04/2010  358,5698314 3
5   17/04/2010  13/04/2010  301,1815352 2
6   24/04/2010  21/04/2010  273,4922895 3,333333333
7   01/05/2010  28/04/2010  128,5989633 3
8   08/05/2010  05/05/2010  447,8858881 3
9   15/05/2010  12/05/2010  387,9828891 3
10  22/05/2010  19/05/2010  138,0770986 3
11  29/05/2010  26/05/2010  370,2147933 3
12  05/06/2010  02/06/2010  139,0451791 3
13  12/06/2010  09/06/2010  217,1286356 3
14  19/06/2010  16/06/2010  72,36972411 3
15  26/06/2010  23/06/2010  282,2911902 3
16  03/07/2010  30/06/2010  324,3215936 3
17  10/07/2010  07/07/2010  210,568691  3
18  17/07/2010  14/07/2010  91,76930829 3
19  24/07/2010  21/07/2010  36,4211218  3,666666667
20  31/07/2010  28/07/2010  37,53981103 3
21  07/08/2010  04/08/2010  91,33282642 3
22  14/08/2010  11/08/2010  28,38587352 3
23  21/08/2010  18/08/2010  58,72836406 3
24  28/08/2010  24/08/2010  102,1050612 2,5
25  04/09/2010  02/09/2010  13,45357513 4,5
26  11/09/2010  08/09/2010  51,24017212 3
27  18/09/2010  15/09/2010  159,7395663 3
28  25/09/2010  21/09/2010  62,71136678 2
29  02/04/2011  31/03/2011  1484,661164 4
30  09/04/2011  06/04/2011  656,1827964 3
31  16/04/2011  13/04/2011  315,3097313 3
32  23/04/2011  20/04/2011  293,2904042 3
33  30/04/2011  26/04/2011  255,7517519 2,4
34  07/05/2011  04/05/2011  360,7035289 3
35  14/05/2011  11/05/2011  342,0902797 3
36  21/05/2011  18/05/2011  386,1380421 3
37  28/05/2011  24/05/2011  418,9624807 2,833333333
38  04/06/2011  01/06/2011  112,7568    3
39  11/06/2011  08/06/2011  85,17855619 3,2
40  18/06/2011  15/06/2011  351,8714638 3
41  25/06/2011  22/06/2011  139,7936898 3
42  02/07/2011  29/06/2011  68,57716191 3,6
43  09/07/2011  06/07/2011  62,31823822 3
44  16/07/2011  13/07/2011  80,7328917  3
45  23/07/2011  20/07/2011  114,9475331 3
46  30/07/2011  27/07/2011  90,13118758 3
47  06/08/2011  03/08/2011  43,29372258 3
48  13/08/2011  10/08/2011  49,39935204 3
49  20/08/2011  16/08/2011  133,746822  2
50  03/09/2011  31/08/2011  76,03928942 3
51  10/09/2011  05/09/2011  27,99834637 1
52  24/03/2012  23/03/2012  366,2625797 5,5
53  31/03/2012  28/03/2012  878,8535513 3
54  07/04/2012  04/04/2012  1029,909052 3
55  14/04/2012  11/04/2012  892,9163416 3
56  21/04/2012  18/04/2012  534,8278693 3
57  28/04/2012  25/04/2012  255,1177585 3
58  05/05/2012  02/05/2012  564,5280546 3
59  12/05/2012  09/05/2012  767,5018168 3
60  19/05/2012  16/05/2012  516,2680148 3
61  26/05/2012  23/05/2012  241,2113073 3
62  02/06/2012  30/05/2012  863,6123397 3
63  09/06/2012  06/06/2012  201,2019288 3
64  16/06/2012  13/06/2012  222,9955486 3
65  23/06/2012  20/06/2012  91,14166632 3
66  30/06/2012  27/06/2012  26,93145693 3
67  07/07/2012  04/07/2012  67,32183278 3
68  14/07/2012  11/07/2012  46,25297513 3
69  21/07/2012  18/07/2012  81,34359825 3,666666667
70  28/07/2012  25/07/2012  49,59130851 3
71  04/08/2012  01/08/2012  44,13438077 3
72  11/08/2012  08/08/2012  30,15773151 3
73  18/08/2012  15/08/2012  57,47256772 3
74  25/08/2012  22/08/2012  31,9109555  3
75  01/09/2012  29/08/2012  52,71058484 3
76  08/09/2012  04/09/2012  24,52495229 2
77  06/04/2013  01/04/2013  1344,388042 1,5
78  13/04/2013  10/04/2013  1304,838687 3
79  20/04/2013  17/04/2013  892,620141  3
80  27/04/2013  24/04/2013  400,1720434 3
81  04/05/2013  01/05/2013  424,8473083 3
82  11/05/2013  08/05/2013  269,2380208 3
83  18/05/2013  15/05/2013  238,9993749 3
84  25/05/2013  22/05/2013  128,4096151 3
85  01/06/2013  29/05/2013  158,5576121 3
86  08/06/2013  05/06/2013  175,2036942 3
87  15/06/2013  12/06/2013  79,20250839 3
88  22/06/2013  19/06/2013  126,9065428 3
89  29/06/2013  26/06/2013  133,7480108 3
90  06/07/2013  03/07/2013  218,0092943 3
91  13/07/2013  10/07/2013  54,08460936 3
92  20/07/2013  17/07/2013  91,54285041 3
93  27/07/2013  24/07/2013  44,64567928 3
94  03/08/2013  31/07/2013  229,5067999 3
95  10/08/2013  07/08/2013  49,70729373 3
96  17/08/2013  14/08/2013  53,38618335 3
97  24/08/2013  21/08/2013  217,2800997 3
98  31/08/2013  28/08/2013  49,43590136 3
99  07/09/2013  04/09/2013  64,88783029 3
100 14/09/2013  11/09/2013  11,04300773 3
  

Итак, в конце у меня есть один главный вопрос: как я могу устранить связь между годами? … и эстетический вопрос: как я могу добавить незначительные отметки на x_axis? По крайней мере, один раз в 6 месяцев, просто чтобы график было легко читать.
Заранее спасибо за любое предложение!

Редактировать

Это код, который я пробовал с предложением, возможно, я неправильно ввел какую-то его часть.

 library(tidyverse)
library(dplyr) 
library(lubridate)

df4 <- data.frame(df$Date, df$A)
colnames(df4)<- c("date","A")
df4$date <- as.Date(df4$date,"%Y/%m/%d")
df4$week_day <- as.numeric(format(df4$date, format='%w'))
df4$endofweek <- df4$date   (6 - df4$week_day)

week_aveA <- df4 %>%
  group_by(endofweek) %>%
  summarise_all(list(mean=mean), na.rm=TRUE) %>%
  na.omit()

week_aveA$endofweek <- as.Date(week_aveA$endofweek,"%d/%m/%Y")
week_aveA$A_mean <- as.numeric(gsub(",", ".", week_aveA$A_mean))
week_aveA$week_day_mean <- as.numeric(gsub(",", ".", week_aveA$week_day_mean))
week_aveA$year <- format(week_aveA$endofweek, "%Y")

library(ggplot2)
library(methods)
library(scales)

mylabel <- function(x) {
  ifelse(grepl("-07-01$", x), "", format(x, "%Y"))
}

ggplot()   
  geom_step(data=week_aveA, aes(x = endofweek, y = A_mean, group = year), colour="gray25")  
  scale_y_continuous(expand = c(0, 0), limits = c(0, 2500))   
  scale_x_date(breaks="6 month", labels = mylabel)  
  labs(y = expression(A~ ~index),
       x = NULL)  
  theme(axis.text.x = element_text(size=10), 
        axis.title = element_text(size=10))
  

Комментарии:

1. Убедитесь, что у вас есть столбец даты / даты и времени в X. Настройте младшую ось x в theme()

Ответ №1:

Вы должны сгруппироваться по year :

  1. Добавьте переменную с значением year в свой набор данных
  2. Сопоставьте переменную года с group эстетической
  3. Для тиков. Увеличьте количество разрывов. Если вам нужны только отметки, но не метки, вы можете использовать пользовательскую функцию, чтобы избавиться от ненужных меток, например, мой подход ниже устанавливает разрывы на «6 месяцев», но заменяет метки середины года пустой строкой:
     week_aveA$endofweek <- as.Date(week_aveA$endofweek,"%d/%m/%Y")
    week_aveA$A_mean <- as.numeric(gsub(",", ".", week_aveA$A_mean))
    week_aveA$week_day_mean <- as.numeric(gsub(",", ".", week_aveA$week_day_mean))
    week_aveA$year <- format(week_aveA$endofweek, "%Y")

    library(ggplot2)
    
    mylabel <- function(x) {
      ifelse(grepl("-07-01$", x), "", format(x, "%Y"))
    }
    ggplot()   
      geom_step(data=week_aveA, aes(x = endofweek, y = A_mean, group = year), colour="gray25")  
      scale_y_continuous(expand = c(0, 0), limits = c(0, 2500))   
      scale_x_date(breaks="6 month", labels = mylabel)  
      labs(y = expression(A~ ~index),
           x = NULL)  
      theme(axis.text.x = element_text(size=10), 
            axis.title = element_text(size=10))
  

введите описание изображения здесь

Комментарии:

1. Спасибо! Я последовал вашим советам, и я смог сгруппировать данные и избежать соединений. Я также пытался добавить второстепенные отметки (ваш подход — это именно то, что я имел в виду), но я не достигаю полностью цели. Я на самом деле добавляю отметки, но значение «каждые 6 месяцев» не является пустым. Я что-то пропустил?

2. Хм. Трудно сказать, что происходит не так. Может быть, вы можете добавить код, который вы пытались отредактировать, в свой пост?

3. Привет, Аллесандра. Извините за поздний ответ. К сожалению, я могу только догадываться, в чем проблема. Единственная причина, по которой я вижу, почему код не работает, заключается в том, что формат endofweek отличается от того, что я получил, используя ваши примерные данные, т.Е. С помощью grepl("-07-01$", x) I установите метки тиков равными "" для всех дат, заканчивающихся на -07-01 . Чтобы проверить формат, добавьте browser() оператор в начале mylabel . Таким образом, вы можете передавать значения и формат дат mylabel .

4. Привет, Стефан! Прошу прощения за задержку, но у меня некоторые проблемы с подключением. Я проверил формат endoftheweek , это дата. Я только модифицировал "%d/%m/%Y" "%Y/%m/%d" , но у меня все еще есть проблема. Итак, я побежал browser() , и это то, что R дал мне Error in grepl("-07-01$", x) : argument "x" is missing, with no default Error during wrapup: INTEGER() can only be applied to a 'integer', not a 'unknown type #29'