У меня есть следующие данные, которые я пытаюсь построить в R ..

     date       year    month  Zone.B   Zone.D
1   2008-May    2008    May 1.5469086   0.9628121
2   2008-June   2008    June    0.5436808   1.3583104
3   2008-July   2008    July    0.5343952   1.0014050
4   2008-Aug    2008    Aug 0.8457998   1.9633247
5   2008-Sept   2008    Sept    1.0564309   1.0598237
6   2008-Nov    2008    Nov 0.8400382   0.6224550
7   2008-Dec    2008    Dec 0.5000899   0.4628020
8   2009-May    2009    May 1.6857730   0.4686881
9   2009-June   2009    June    2.1144817   1.2159128
10  2009-July   2009    July    1.3032429   0.9161256
11  2009-Aug    2009    Aug 1.7283975   1.5130496
12  2009-Sept   2009    Sept    1.1234053   1.5315700
13  2009-Nov    2009    Nov 1.1072778   1.3294973
14  2009-Dec    2009    Dec 1.4293872   1.2318001
15  2010-May    2010    May 1.2573056   2.9030824
16  2010-June   2010    June    0.8183244   1.9133592
17  2010-July   2010    July    1.1637721   1.0880351
18  2010-Aug    2010    Aug 1.2357399   1.4476880
19  2010-Sept   2010    Sept    0.8154475   1.9440145
20  2010-Nov    2010    Nov 0.8625087   1.7255681
21  2010-Dec    2010    Dec 0.7454908   1.8538506
22  2011-May    2011    May 1.0643353   1.9391681
23  2011-June   2011    June    1.6620765   2.2622461
24  2011-July   2011    July    0.8392645   1.4462998
25  2011-Aug    2011    Aug 1.0730535   2.2823350
26  2011-Sept   2011    Sept    1.1551744   1.1851883
27  2011-Nov    2011    Nov 0.6946148   1.1089916
28  2011-Dec    2011    Dec 1.1289277   0.9832297
29  2012-May    2012    May 0.7801685   1.3918411
30  2012-June   2012    June    0.7026750   1.3219030
31  2012-July   2012    July    1.3585219   1.6716370
32  2012-Aug    2012    Aug 1.2826630   1.6898635
33  2012-Sept   2012    Sept    1.8615806   1.2897994
34  2012-Nov    2012    Nov 1.7114777   1.0998009
35  2012-Dec    2012    Dec 0.7149941   0.3424369
36  2013-May    2013    May 1.3469518   5.3418421
37  2013-June   2013    June    3.2474936   3.6502369
38  2013-July   2013    July    1.2859735   0.9634012
39  2013-Aug    2013    Aug 2.2181734   2.5195328
40  2013-Sept   2013    Sept    2.2866214   1.1138549
41  2013-Nov    2013    Nov 0.6300820   0.8241262
42  2013-Dec    2013    Dec 0.8444934   0.5658561
43  2014-May    2014    May 0.5130557   0.7943081
44  2014-June   2014    June    0.2296881   1.7998841
45  2014-July   2014    July    0.7425870   1.1508025
46  2014-Aug    2014    Aug 0.6200843   1.2819195
47  2014-Sept   2014    Sept    0.3960585   1.1619590
48  2014-Nov    2014    Nov 0.3980511   0.7375606
49  2014-Dec    2014    Dec 0.3009843   0.6061867
50  2015-May    2015    May 1.2674316   5.4225521
51  2015-June   2015    June    1.0184140   3.5031324
52  2015-July   2015    July    1.2698522   1.2475438
53  2015-Aug    2015    Aug 1.0985706   1.3307636
54  2015-Sept   2015    Sept    1.1795278   1.1892627
55  2015-Nov    2015    Nov 0.6699403   1.4401562
56  2015-Dec    2015    Dec 0.9199800   1.7972394
57  2016-June   2016    June    0.5443802   2.3273397
58  2016-July   2016    July    0.6212349   0.9363671
59  2016-Aug    2016    Aug 1.2685108   1.7920707
60  2016-Sept   2016    Sept    1.6758284   1.3687859
61  2016-Nov    2016    Nov 0.8589559   1.1374661
62  2016-Dec    2016    Dec 0.8298990   0.8522818
63  2017-June   2017    June    1.2096848   1.8674565
64  2017-July   2017    July    1.7883816   1.5487620
65  2017-Aug    2017    Aug 2.2732680   1.5071044
66  2017-Sept   2017    Sept    2.3455175   1.8381368
67  2017-Nov    2017    Nov 1.7463599   1.9304698
68  2017-Dec    2017    Dec 0.8478681   0.9660615
69  2018-June   2018    June    4.2659266   1.2897004
70  2018-July   2018    July    1.8813193   1.6957090
71  2018-Aug    2018    Aug 3.6125893   1.6265312
72  2018-Sept   2018    Sept    2.5180816   0.9977127
73  2018-Nov    2018    Nov 1.3147816   1.3784422
74  2018-Dec    2018    Dec 1.4117959   1.6234253
Showing 1 to 20 of 74 entries, 5 total columns

Я пытаюсь построить средние значения для каждой зоны по месяцам и годам.

Я пробовал этот код

ggplot(df, aes(x=Month, y=Zone.B)) + 
  geom_line(aes()) +
  geom_point(aes())+
  labs(title = "Mean Density", y = "Mean Density (# fish/100m2", x = "Date")+
  theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(),
                     panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"))

Но я не могу понять, как заставить его построить год, этот код отображает средние значения по месяцам, но не разбивает год ...

enter image description here

Когда я пробую aes (x = date, y = Zone.B), как предложил Dave2e ниже, он делает следующее ... как я могу это очистить, чтобы вы действительно могли читать даты?

enter image description here

Я пытаюсь сделать что-то вроде этого ... Если бы я мог нанести обе зоны на одну фигуру, было бы даже лучше!

enter image description here

0
user13314714 15 Апр 2020 в 21:23

1 ответ

Лучший ответ

При работе с датами в R всегда лучше скрыть их в объекте даты и сохранить как объект даты. При необходимости всегда можно выполнить группировку и форматирование.
Также ggplot любит, когда его данные имеют «аккуратный» формат. Таким образом, «Zone.B» и «Zone.D» должны быть значениями переменной Zone.

Приведенный ниже код с преобразованием столбца даты в объект даты. Затем он преобразует фрейм данных из широкого формата в более длинный формат, создав переменную зоны. Затем данные наносятся на график.
Окончательный график близок к запрошенному вами изображению. Я оставляю на будущее вопрос, чтобы изменить ось точно так, как нужно.

#convert date column to dates
df$date <-  as.Date(paste(df$date, 01), "%Y-%b %d")

#convert from wide to long
library(tidyr)
dflong <- pivot_longer(df, cols = starts_with("Zone"), names_to = "Zone", values_to = "value")

library(ggplot2)
ggplot(dflong, aes(x=date, y=value, color=Zone, group=Zone)) + 
  geom_line(aes()) +
  geom_point(aes())+
  labs(title = "Mean Density", y = "Mean Density (# fish/100m2", x = "Date")+
  scale_x_date(date_breaks = "4 month", date_labels ="%b-%y") +
  theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(),
                     panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"),
                     axis.text.x = element_text(angle = 60))

Начальные данные:

df<-structure(list(date = structure(c(5L, 4L, 3L, 1L, 7L, 6L, 2L, 
12L, 11L, 10L, 8L, 14L, 13L, 9L, 19L, 18L, 17L, 15L, 21L, 20L, 
16L, 26L, 25L, 24L, 22L, 28L, 27L, 23L, 33L, 32L, 31L, 29L, 35L, 
34L, 30L, 40L, 39L, 38L, 36L, 42L, 41L, 37L, 47L, 46L, 45L, 43L, 
49L, 48L, 44L, 54L, 53L, 52L, 50L, 56L, 55L, 51L, 60L, 59L, 57L, 
62L, 61L, 58L, 66L, 65L, 63L, 68L, 67L, 64L, 72L, 71L, 69L, 74L, 
73L, 70L), .Label = c("2008-Aug", "2008-Dec", "2008-July", "2008-June", 
"2008-May", "2008-Nov", "2008-Sep", "2009-Aug", "2009-Dec", "2009-July", 
"2009-June", "2009-May", "2009-Nov", "2009-Sep", "2010-Aug", 
"2010-Dec", "2010-July", "2010-June", "2010-May", "2010-Nov", 
"2010-Sep", "2011-Aug", "2011-Dec", "2011-July", "2011-June", 
"2011-May", "2011-Nov", "2011-Sep", "2012-Aug", "2012-Dec", "2012-July", 
"2012-June", "2012-May", "2012-Nov", "2012-Sep", "2013-Aug", 
"2013-Dec", "2013-July", "2013-June", "2013-May", "2013-Nov", 
"2013-Sep", "2014-Aug", "2014-Dec", "2014-July", "2014-June", 
"2014-May", "2014-Nov", "2014-Sep", "2015-Aug", "2015-Dec", "2015-July", 
"2015-June", "2015-May", "2015-Nov", "2015-Sep", "2016-Aug", 
"2016-Dec", "2016-July", "2016-June", "2016-Nov", "2016-Sep", 
"2017-Aug", "2017-Dec", "2017-July", "2017-June", "2017-Nov", 
"2017-Sep", "2018-Aug", "2018-Dec", "2018-July", "2018-June", 
"2018-Nov", "2018-Sep"), class = "factor"), year = c(2008L, 2008L, 
2008L, 2008L, 2008L, 2008L, 2008L, 2009L, 2009L, 2009L, 2009L, 
2009L, 2009L, 2009L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2013L, 2013L, 2013L, 
2013L, 2013L, 2013L, 2013L, 2014L, 2014L, 2014L, 2014L, 2014L, 
2014L, 2014L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2017L, 2017L, 2017L, 
2017L, 2017L, 2017L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L
), month = structure(c(5L, 4L, 3L, 1L, 7L, 6L, 2L, 5L, 4L, 3L, 
1L, 7L, 6L, 2L, 5L, 4L, 3L, 1L, 7L, 6L, 2L, 5L, 4L, 3L, 1L, 7L, 
6L, 2L, 5L, 4L, 3L, 1L, 7L, 6L, 2L, 5L, 4L, 3L, 1L, 7L, 6L, 2L, 
5L, 4L, 3L, 1L, 7L, 6L, 2L, 5L, 4L, 3L, 1L, 7L, 6L, 2L, 4L, 3L, 
1L, 7L, 6L, 2L, 4L, 3L, 1L, 7L, 6L, 2L, 4L, 3L, 1L, 7L, 6L, 2L
), .Label = c("Aug", "Dec", "July", "June", "May", "Nov", "Sept"
), class = "factor"), Zone.B = c(1.5469086, 0.5436808, 0.5343952, 
0.8457998, 1.0564309, 0.8400382, 0.5000899, 1.685773, 2.1144817, 
1.3032429, 1.7283975, 1.1234053, 1.1072778, 1.4293872, 1.2573056, 
0.8183244, 1.1637721, 1.2357399, 0.8154475, 0.8625087, 0.7454908, 
1.0643353, 1.6620765, 0.8392645, 1.0730535, 1.1551744, 0.6946148, 
1.1289277, 0.7801685, 0.702675, 1.3585219, 1.282663, 1.8615806, 
1.7114777, 0.7149941, 1.3469518, 3.2474936, 1.2859735, 2.2181734, 
2.2866214, 0.630082, 0.8444934, 0.5130557, 0.2296881, 0.742587, 
0.6200843, 0.3960585, 0.3980511, 0.3009843, 1.2674316, 1.018414, 
1.2698522, 1.0985706, 1.1795278, 0.6699403, 0.91998, 0.5443802, 
0.6212349, 1.2685108, 1.6758284, 0.8589559, 0.829899, 1.2096848, 
1.7883816, 2.273268, 2.3455175, 1.7463599, 0.8478681, 4.2659266, 
1.8813193, 3.6125893, 2.5180816, 1.3147816, 1.4117959), Zone.D = c(0.9628121, 
1.3583104, 1.001405, 1.9633247, 1.0598237, 0.622455, 0.462802, 
0.4686881, 1.2159128, 0.9161256, 1.5130496, 1.53157, 1.3294973, 
1.2318001, 2.9030824, 1.9133592, 1.0880351, 1.447688, 1.9440145, 
1.7255681, 1.8538506, 1.9391681, 2.2622461, 1.4462998, 2.282335, 
1.1851883, 1.1089916, 0.9832297, 1.3918411, 1.321903, 1.671637, 
1.6898635, 1.2897994, 1.0998009, 0.3424369, 5.3418421, 3.6502369, 
0.9634012, 2.5195328, 1.1138549, 0.8241262, 0.5658561, 0.7943081, 
1.7998841, 1.1508025, 1.2819195, 1.161959, 0.7375606, 0.6061867, 
5.4225521, 3.5031324, 1.2475438, 1.3307636, 1.1892627, 1.4401562, 
1.7972394, 2.3273397, 0.9363671, 1.7920707, 1.3687859, 1.1374661, 
0.8522818, 1.8674565, 1.548762, 1.5071044, 1.8381368, 1.9304698, 
0.9660615, 1.2897004, 1.695709, 1.6265312, 0.9977127, 1.3784422, 
1.6234253)), class = "data.frame", row.names = c(NA, -74L))
2
Dave2e 16 Апр 2020 в 14:38