Два графика в пределах одного фасета в ggplot2

#r #ggplot2 #facet #facet-wrap

#r #ggplot2 #фасет #перенос фасета

Вопрос:

У меня есть два типа данных для создания двух типов графиков, штриховых и линейных. Они имеют разную ось y, но одинаковую ось x. Каждый из них классифицируется по одним и тем же уровням категорий

Пример кода:

 data <- data.frame( Station = sample(LETTERS[seq( from = 1, to = 4 )],50, rep = TRUE),
                  Date = sample(seq(as.Date('2015/01/01'), as.Date('2015/12/31'), by="day"), 50),
                   Presence = sample(0:10,50,rep = TRUE),
                   Noise = sample(70:130,50, rep=TRUE))
noise <-  ggplot() 
    geom_line(data = data,aes(x=Date, y= Noise, color= Station)) 
    scale_x_date(date_breaks = "1 month") 
    facet_wrap(~Station, ncol=2, strip.position="right") 
    theme(axis.title.x = element_text(margin = margin(t = 20))) 
    guides(colour = guide_legend(override.aes = list(size=3))) 
    coord_cartesian(xlim = c(as.Date("2015-02-01"),as.Date("2015-10-30"))) 
    labs( x='Date') 
    theme_classic(base_family = "serif")
 

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

 pres <-ggplot() 
  geom_bar(data = data,aes(x= Date, y = Presence), stat = "identity") 
  scale_x_date(date_breaks = "1 month") 
  facet_wrap(~Station, ncol=2, strip.position="right") 
  theme(axis.title.x = element_text(margin = margin(t = 20))) 
  coord_cartesian(xlim = c(as.Date("2015-02-01"),as.Date("2015-10-30"))) 
  labs( x='Date') 
  theme_classic(base_family = "serif")
 

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

Что я хотел бы сделать, так это объединить два графика, но обозначить одним и тем же аспектом (станцией).

Краткий пример, который я сделал в photoshop, будет выглядеть примерно так:

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

и т.д.

Любая помощь будет оценена!

Комментарии:

1. проверьте пакет ggh4x — он допускает вложенные фасеты

2. r2evans — хорошо, я могу попытаться это выяснить — я не часто использую stackoverflow, не совсем уверен, как все это работает

3. тьебо, вложенные фасеты выглядят как правильная идея, но как сделать так, чтобы два графика на одном рисунке были фасетными, — это то, на чем я сейчас застрял

Ответ №1:

ggplot у него нет красивого способа сделать это, но это, безусловно, можно сделать:

 ggplot() 
  geom_line(data = data,aes(x=Date, y= Noise, color= Station)) 
  geom_bar(data = data,aes(x= Date, y = Presence*10), stat = "identity") 
  scale_x_date(date_breaks = "1 month") 
  scale_y_continuous(
    name = "Noise",
    sec.axis = sec_axis(~./10, name="Presence")
  )  
  facet_wrap(~Station, ncol=2, strip.position="right") 
  theme(axis.title.x = element_text(margin = margin(t = 20))) 
  guides(colour = guide_legend(override.aes = list(size=3))) 
  coord_cartesian(xlim = c(as.Date("2015-02-01"),as.Date("2015-10-30"))) 
  labs( x='Date') 
  theme_classic(base_family = "serif")
 

Итак, что здесь делается, это добавление geom_bar после geom_line и добавление scale_y_continuous . sec.axis В последнем предусмотрена вторая ось, однако все графики будут отображаться на первичной оси независимо от того, вторичная ось не имеет функциональности. Чтобы правильно использовать его, нам нужно самим определить масштаб между осями и добавить их в geom_bar и sec.axis .

Результат выглядит следующим образом: введите описание изображения здесь

Вы также можете использовать пакет ggbreak для создания разрыва по оси y, в то время как оба графика остаются на одной оси y, например:

 ggplot() 
  geom_line(data = data,aes(x=Date, y= Noise, color= Station)) 
  geom_bar(data = data,aes(x= Date, y = Presence), stat = "identity") 
  scale_x_date(date_breaks = "1 month") 
  scale_y_break(breaks = c(10, 70), scales = 1.5) 
  facet_wrap(~Station, ncol=4, strip.position="right") 
  theme(axis.title.x = element_text(margin = margin(t = 20))) 
  guides(colour = guide_legend(override.aes = list(size=3))) 
  coord_cartesian(xlim = c(as.Date("2015-02-01"),as.Date("2015-10-30"))) 
  labs( x='Date') 
  theme_classic(base_family = "serif")
 

Который будет выглядеть так:
введите описание изображения здесь

К сожалению, я не смог заставить это работать, так ncol=2 как порядок графиков будет испорчен.

Комментарии:

1. Я сделал что-то подобное с двумя графиками вместе, но мой руководитель предпочитает, чтобы они были на отдельных осях y

2. Какую функциональность наличия второй оси y вам не хватает в этом ответе?

3. вероятная удобочитаемость — мои истинные данные перекрывают друг друга на одном графике, и поэтому наличие двух отдельных графиков означает возможность просмотра изменений в y в более мелком масштабе, а также изменение масштаба любого из данных приведет к ошибкам в результатах

4. @GabrielleMacklin добавил решение к моему первоначальному ответу. Я не думаю, что в пакете возможно намного больше ggplot2

5. @Wieste de Vries Я немного поработаю с этим, но, к сожалению, с перекрывающимися данными это не очень хорошо разбивается (столбчатый график увеличивается до 100, линейный график уменьшается до 70)