ggplot如何在特定月份小面板添加平均线

3

我试图为我拥有的每年时间序列ggplot图中的每个月份“3”添加一个“平均线”。

我希望通过facets的平均值绘制一条水平线 - 我尝试过group_bymutate等方法,但无法使其正常工作。

期望的输出只是在每个facet的基础上画出一个水平线,该线基于该facet月份的“3”平均值。

代码:

dat %>% 
  ggplot(aes(x = day, y = NO2)) +
  geom_line() +
  facet_grid(~year)

数据:

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))

类似于这些 https://stackoverflow.com/a/49453699/786542 和 https://stackoverflow.com/a/55194736/786542? - Tung
这个回答是否解决了你的问题?在ggplot柱状图上添加水平线以显示选择因子水平的值 - tjebo
2个回答

8
你可以使用geom_smooth,并拟合一个仅有截距的线:
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

这是可行的原因在于,如果你拟合一个线性模型,例如lm(y~1),这是一个只有截距的模型,截距将会是平均值。

2
你可以尝试这样做。
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)

我所做的是使用group_by和mutate计算每个数据点的平均值。然后我添加了另一个geom_line层,但这次我将y美学设置为平均值而不是其他值。希望这可以帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接