Добавьте линию к каждому фасету в сетке - PullRequest
1 голос
/ 24 июня 2019

Предположим, у меня есть следующий фрейм данных:

  dates          types vals
1 2018-02-01     a     10
2 2018-03-01     a     11
3 2018-04-01     a     12
4 2018-05-01     b     20
5 2018-06-01     b     21
6 2018-07-01     b     22
7 2018-08-01     c     30
8 2018-09-01     c     31
9 2018-10-01     c     32

Я визуализировал ее как сетку с 3 гранями (по одной для каждого типа: a, b и c) с общей осью X (даты):

gg <- ggplot(df, aes(x = dates, y = vals)) + 
  geom_line(aes(color = df$types)) +
  geom_point() +
  facet_grid(types ~ ., scales = "free_y") +
  scale_color_manual(values =c("blue", "orange", "green"))

enter image description here

Теперь я хотел бы добавить горизонтальную линию для каждого фасета, чтобы у каждого фасета был свой собственный y-перехват. Исходя из аналогичных вопросов, я попытался создать фрейм данных со столбцом перехватов:

lower = seq(10,30,10); upper = seq(12,32,10)
bounds <- data.frame(lower, upper)

И добавить его, используя geom_hline:

gg + geom_hline(aes(yintercept = lower), data = bounds, color = 'red')

Но в результате получается, что каждый фасет имеет все три строки вместо отдельной строки (я также хочу добавить строку со столбцом upper, но я думаю, что решение симметрично).

enter image description here

Ответы [ 2 ]

3 голосов
/ 24 июня 2019

Вам необходимо добавить спецификацию lower, чтобы она соответствовала таким многогранным данным:

library('dplyr')
df <- df %>% mutate(lower = rep(c(10,20,30), each =3))
df
       dates types vals lower
1 2018-02-01     a   10    10
2 2018-03-01     a   11    10
3 2018-04-01     a   12    10
4 2018-05-01     b   20    20
5 2018-06-01     b   21    20
6 2018-07-01     b   22    20
7 2018-08-01     c   30    30
8 2018-09-01     c   31    30
9 2018-10-01     c   32    30

Затем укажите график, как и раньше, и добавьте geom_hline как на измененном df с * 1006.* столбец - вот так:

gg + geom_hline(aes(yintercept = lower), color = 'red')

Тогда вы получите что-то вроде этого:

enter image description here

1 голос
/ 24 июня 2019

Хотя существует принятый ответ , здесь есть один способ загрузки bounds из другого кадра данных , как ОП запрашивает в комментарии.

Сначала посмотрите, куда должен идти types в кадре данных bounds.

cbind(bounds, types = c('a', 'b', 'c'))
#  lower upper types
#1    10    12     a
#2    20    22     b
#3    30    32     c

И каков результат при слиянии с оригиналом df.

merge(cbind(bounds, types = c('a', 'b', 'c')), df)
#  types lower upper      dates vals
#1     a    10    12 2018-02-01   10
#2     a    10    12 2018-03-01   11
#3     a    10    12 2018-04-01   12
#4     b    20    22 2018-05-01   20
#5     b    20    22 2018-06-01   21
#6     b    20    22 2018-07-01   22
#7     c    30    32 2018-08-01   30
#8     c    30    32 2018-09-01   31
#9     c    30    32 2018-10-01   32

Кажется, именно там, где должен быть types.
Так что постройте, адаптируя код в вопросе.

gg + geom_hline(data = merge(cbind(bounds, types = c('a', 'b', 'c')), df),
             aes(yintercept = lower), 
             color = 'red')

enter image description here

...