ggplot2: несколько линий тренда на многогранном графике

Я пытаюсь добавить две линии тренда к данным, нанесенным на мой многогранный график для двух разных глубин (Road=color). Geom_smooth работает для создания первого графика(pred_new2) с линией тренда, но как только я добавляю facet_wrap - график генерируется, но без каких-либо линий тренда/сглаживания и без какой-либо ошибки.

pred_new$Site <- factor(pred_new$Site, 
                        levels = c("A", "B", "C", "D", "E", "F", "G", "H", "I"))

pred_new2 <- ggplot(pred_new, aes(x = No_cars, y = Site, color = Road)) + 
  geom_point() + 
  geom_smooth(aes(x = No_cars, y = Site, color = Road), method = "lm")

pred_new3 <- pred_new2 + 
  geom_errorbarh(aes(xmin = No_cars - standerror, xmax = No_cars + standerror))

pred_new4 <- pred_new3 + 
  facet_wrap(~ Days, scales = "free_x") + 
  ylab("Site") + 
  xlab("No_cars") + 
  theme_classic()
pred_new4

Любая помощь будет принята с благодарностью.

pred_new = structure(list(Site = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 
                                             8L, 9L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L, 5L, 
                                             6L, 7L, 8L, 9L, 1L, 2L, 3L,  4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L, 
                                             4L, 5L, 6L, 7L, 8L, 9L), 
                                           .Label = c("A", "B", "C", "D", "E", "F", "G", "H", "I"), 
                                           class = "factor"), 
                          Days = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
                                             3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
                                             2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 
                                             1L, 1L, 1L, 1L, 1L, 1L), 
                                           .Label = c("Thursday", "Tuesday", "Wednesday"), 
                                           class = "factor"),
                          Road = structure(c(1L, 1L, 1L, 1L, 1L, 
                                             1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                             1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                             2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                             2L), 
                                           .Label = c("east", "west"), 
                                           class = "factor"), 
                          No_cars = c(15.266427, 8.323348, 8.368608, 9.747807, 7.976356, 8.5684, 6.604537, 
                                      3.812109, 6.719904, 4.799487, 4.996091, 4.796, 4.991479, 4.525789, 
                                      5.115136, 4.939559, 4.783792, 4.185007, 3.857553, 3.095228, 2.890727, 
                                      3.132784, 3.352974, 3.42561, 2.900284, 2.35416, 2.889976, 17.266427, 
                                      10.323348, 10.368608, 11.747807, 9.976356, 10.5684, 8.604537, 5.812109, 
                                      8.719904, 6.799487, 6.996091, 6.796, 6.991479, 6.525789, 7.115136, 
                                      6.939559, 6.783792, 6.185007, 5.857553, 5.095228, 4.890727, 5.132784, 
                                      5.352974, 5.42561, 4.900284, 4.35416, 4.889976), 
                          standerror = c(1.7108483, 0.8175014, 0.6365042, 0.7171749, 0.9978123, 0.9881427, 
                                         0.9215597, 0.6365042, 1.6303975, 0.404129, 0.1934362, 0.1503158, 
                                         0.1694848, 0.2362161, 0.2337497, 0.2180687, 0.1604379, 0.3902528, 
                                         0.3276444, 0.1568268, 0.1218673, 0.1374084, 0.1915103, 0.1895107, 
                                         0.1767974, 0.1300738, 0.3163943, 1.7108483, 0.8175014, 0.6365042, 
                                         0.7171749, 0.9978123, 0.9881427, 0.9215597, 0.6365042, 1.6303975, 
                                         0.404129, 0.1934362, 0.1503158, 0.1694848, 0.2362161, 0.2337497,
                                         0.2180687, 0.1604379, 0.3902528, 0.3276444, 0.1568268, 0.1218673, 
                                         0.1374084, 0.1915103, 0.1895107, 0.1767974, 0.1300738, 0.3163943)), 
                     row.names = c(NA, -54L), class = "data.frame")

person Elle Bowd    schedule 07.09.2018    source источник
comment
Добро пожаловать в SO Elle Blank. Я настоятельно рекомендую вам форматировать код как код. Это облегчает людям чтение и, следовательно, им легче помочь вам. Я сделал это за вас в этом вопросе.   -  person James Jones    schedule 07.09.2018
comment
Спасибо, @JamesJones впервые задает вопрос!   -  person Elle Bowd    schedule 07.09.2018
comment
Попробуйте опубликовать свои данные или минимальный игрушечный набор данных, достаточный для воспроизведения проблемы. Одна из возможностей состоит в том, что добавление фасетов означает, что на фасете недостаточно точек для построения подогнанной линии, но трудно сказать, не видя данных.   -  person arvi1000    schedule 07.09.2018
comment
@arvi1000 arvi1000 Я добавил данные, пожалуйста, смотрите выше   -  person Elle Bowd    schedule 07.09.2018
comment
по 9 баллов за каждую грань   -  person Elle Bowd    schedule 07.09.2018
comment
@ElleBlank: пожалуйста, используйте dput(pred_new) для обмена данными. Подробнее см. здесь stackoverflow.com/questions/5963269/   -  person Tung    schedule 07.09.2018
comment
Для каждого уровня Days у вас есть только одно наблюдение в каждой категории Road (east или west), и, поскольку Site является фактором, не может быть никакой тенденции.   -  person Adela    schedule 07.09.2018
comment
Каков ваш ожидаемый результат?   -  person Adela    schedule 07.09.2018
comment
Спасибо Адела. Я хотел отследить тенденцию no_cars на разных сайтах... есть ли способ обойти это?   -  person Elle Bowd    schedule 07.09.2018


Ответы (1)


Я предполагаю, что вы меняете оси. Чтобы включить тренд, вам нужны числовые значения для Site, поэтому я включаю as.numeric(Site) в ggplot.

library(ggplot2)

ggplot(pred_new, aes(x = as.numeric(Site), y = No_cars, color = Road)) + 
  geom_point() + 
  geom_smooth(method = "lm") +
  geom_errorbar(aes(ymin = No_cars - standerror, ymax = No_cars + standerror)) +
  xlab("Site") + 
  # this will recode your x-axis
  scale_x_continuous(breaks = 1:9, labels = LETTERS[1:9]) +
  facet_wrap(~ Days, scales = "free_x") + 
  theme_classic() +
  # you can swap x and y axes with coord_flip()
  coord_flip()

Это желаемый результат?

введите здесь описание изображения

Если вам действительно нужно Site на оси Y, вы можете просто перевернуть оси X и Y:

ggplot(pred_new, aes(y = as.numeric(Site), x = No_cars, color = Road)) + 
  geom_point() + 
  geom_smooth(method = "lm") +
  geom_errorbarh(aes(xmin = No_cars - standerror, xmax = No_cars + standerror)) +
  ylab("Site") + 
  # this will recode your y-axis
  scale_y_continuous(breaks = 1:9, labels = LETTERS[1:9]) +
  facet_wrap(~ Days, scales = "free_x") + 
  theme_classic()

введите здесь описание изображения

person Adela    schedule 07.09.2018
comment
Большое спасибо Адела! Это в значительной степени именно то, что мне было нужно, однако я надеялся иметь Site на оси y, поскольку sites являются общими для разных day, тогда как масштаб no_cars отличается в зависимости от того, что day. Если бы я сделал сайт числовой переменной - можно ли изменить ось Y, чтобы читать разные сайты, а не числа. Спасибо, Элль - person Elle Bowd; 08.09.2018
comment
Я добавил оси флип в ответ. Надеюсь это поможет. - person Adela; 08.09.2018