3

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))
user8959427
  • 2,027
  • 9
  • 20
  • Something like these https://stackoverflow.com/a/49453699/786542 & https://stackoverflow.com/a/55194736/786542? – Tung Mar 28 '20 at 23:41
  • Does this answer your question? [Adding horizontal lines to a ggplot-barchart with the value of selected factor-levels](https://stackoverflow.com/questions/49453561/adding-horizontal-lines-to-a-ggplot-barchart-with-the-value-of-selected-factor-l) – tjebo Mar 29 '20 at 10:14

2 Answers2

8

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)

enter image description here

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.

Community
  • 1
  • 1
StupidWolf
  • 45,075
  • 17
  • 40
  • 72
2

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)

enter image description here 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!!

Bertil Baron
  • 4,923
  • 1
  • 15
  • 24