Reputation: 2067
I am trying to add an "average" line for the month "3" for each year of time series ggplot plots that I have.
I want to draw a horizontal line through the average of the facets
- I have tried group_by
, mutate
etc. but cannot get it working.
Expected output would be just a horizontal line through each of the facets based on that facets months "3" average value.
Code:
dat %>%
ggplot(aes(x = day, y = NO2)) +
geom_line() +
facet_grid(~year)
Data:
dat <- structure(list(station_location = c("Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen", "Pza del Carmen", "Pza del Carmen", "Pza del Carmen",
"Pza del Carmen"), date = structure(c(16495, 16496, 16497, 16498,
16499, 16500, 16501, 16502, 16503, 16504, 16505, 16506, 16507,
16508, 16509, 16510, 16511, 16512, 16513, 16514, 16515, 16516,
16517, 16518, 16519, 16520, 16521, 16522, 16523, 16524, 16525,
16861, 16862, 16863, 16864, 16865, 16866, 16867, 16868, 16869,
16870, 16871, 16872, 16873, 16874, 16875, 16876, 16877, 16878,
16879, 16880, 16881, 16882, 16883, 16884, 16885, 16886, 16887,
16888, 16889, 16890, 16891, 17226, 17227, 17228, 17229, 17230,
17231, 17232, 17233, 17234, 17235, 17236, 17237, 17238, 17239,
17240, 17241, 17242, 17243, 17244, 17245, 17246, 17247, 17248,
17249, 17250, 17251, 17252, 17253, 17254, 17255, 17256, 17591,
17592, 17593, 17594, 17595, 17596, 17597, 17598, 17599, 17600,
17601, 17602, 17603, 17604, 17605, 17606, 17607, 17608, 17609,
17610, 17611, 17612, 17613, 17614, 17615, 17616, 17617, 17618,
17619, 17620, 17621, 17956, 17957, 17958, 17959, 17960, 17961,
17962, 17963, 17964, 17965, 17966, 17967, 17968, 17969, 17970,
17971, 17972, 17973, 17974, 17975, 17976, 17977, 17978, 17979,
17980, 17981, 17982, 17983, 17984, 17985, 17986), class = "Date"),
yvar = c(31, 35, 51, 55, 50, 62, 83, 62, 74, 80, 82, 77,
54, 38, 39, 48, 54, 49, 36, 36, 36, 37, 58, 41, 32, 38, 44,
57, 40, 54, 69, 70, 57, 48, 45, 35, 33, 39, 46, 46, 43, 50,
50, 49, 51, 54, 72, 64, 47, 35, 41, 53, 46, 55, 44, 48, 35,
21, 23, 34, 53, 34, 42, 53, 48, 26, 25, 34, 45, 71, 79, 80,
59, 31, 30, 43, 44, 45, 58, 65, 59, 43, 33, 29, 37, 50, 48,
30, 32, 47, 59, 57, 44, 39, 60, 33, 34, 37, 39, 41, 57, 55,
42, 21, 28, 48, 47, 28, 35, 33, 38, 44, 44, 51, 59, 60, 31,
39, 55, 47, 47, 28, 20, 30, 56, 49, 34, 13, 22, 16, 18, 34,
38, 38, 41, 37, 29, 39, 58, NA, NA, NA, 29, 30, 42, 44, 33,
29, 32, 24, 44, 48, 34, 27, 26), year = c(2015L, 2015L, 2015L,
2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L,
2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L,
2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L,
2015L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L,
2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L,
2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L,
2016L, 2016L, 2016L, 2016L, 2016L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L,
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L,
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L,
2018L, 2018L, 2018L, 2018L, 2019L, 2019L, 2019L, 2019L, 2019L,
2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L,
2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L,
2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L, 2019L),
month = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), day = c(1L, 2L, 3L, 4L,
5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L,
18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L,
30L, 31L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L,
13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L,
25L, 26L, 27L, 28L, 29L, 30L, 31L, 1L, 2L, 3L, 4L, 5L, 6L,
7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L,
19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L,
31L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L,
14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L,
26L, 27L, 28L, 29L, 30L, 31L, 1L, 2L, 3L, 4L, 5L, 6L, 7L,
8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L,
20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-155L))
Upvotes: 3
Views: 623
Reputation: 46908
You can use geom_smooth, and fit an intercept only line:
dat %>%
ggplot(aes(x = day, y = yvar)) +
geom_line() +
geom_smooth(method="lm",formula=y~1,se=FALSE)+
facet_grid(~year)
This works because if you fit a linear model, e.g lm(y~1), this is an intercept only model and the intercept will be the mean.
Upvotes: 8
Reputation: 5003
you could try something like this
dat %>%
group_by(year) %>%
mutate(mean = mean(yvar, na.rm = TRUE)) %>%
ggplot(aes(x = day, y = yvar)) +
geom_line() +
geom_line(aes(y = mean), color = "blue") +
facet_grid(~year)
what I do is to calculate the mean value for each data point that I have with group_by and mutate. then I add one more geom_line layer but this times I set the y aestetic to be the average value instead of.
Hope this helps!!
Upvotes: 2