#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
:
- Добавьте переменную с значением
year
в свой набор данных - Сопоставьте переменную года с
group
эстетической - Для тиков. Увеличьте количество разрывов. Если вам нужны только отметки, но не метки, вы можете использовать пользовательскую функцию, чтобы избавиться от ненужных меток, например, мой подход ниже устанавливает разрывы на «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'