Построение графика из двух списков данных на одном рисунке из вложенного tibble

#r #ggplot2 #nested #tidyr

#r #ggplot2 #вложенный #tidyr

Вопрос:

У меня есть вложенный список с несколькими списками данных. Я могу отобразить каждый источник данных на отдельном рисунке, но я застрял, пытаясь получить сглаживающую линию из каждого источника данных друг над другом на одном рисунке. Вот пример кода с использованием набора данных mtcars.

 library(dplyr)
library(tidyr)
library(purrr)
library(ggplot2)
by_cyl <- mtcars %>%  
  group_by(cyl, gear) %>%  
  nest() %>%  
  rename(cyl_data = data)

by_gear <- mtcars %>% 
  group_by(gear) %>%  
  nest() %>%  
  rename(gear_data = data

mtcars_nest <- left_join(by_cyl, by_gear, by = "gear")

mtcars_nest <- mtcars_nest %>% 
  mutate(
    map(cyl_data, ~ ggplot(., aes(x = wt, y = mpg))   
                             geom_point()  
                             geom_smooth(se = TRUE, color = 'blue')
    )
  ) %>% 
  rename(plot_cyl = `map(...)`)

mtcars_nest <- mtcars_nest %>% 
  mutate(
    map(gear_data, ~ ggplot(., aes(x = wt, y = mpg))   
          geom_point()  
          geom_smooth(se = TRUE, color = 'red')
    )
  ) %>% 
  rename(plot_gear = `map(...)`)

mtcars_nest$plot_cyl[1]
mtcars_nest$plot_gear[1]

#How to get these two plots on one figure?
  

Есть мысли о том, как получить mtcars $ plot_cyl и mtcars $ plot_gear на одном рисунке? Что мне действительно нужно, так это добавить еще один список gg в mtcars_nest tibble, чтобы в итоге у меня получилась структура типа cyl, gear, cyl_data, gear_data, plot_cyl, plot_gear и plot_cyl_gear в mtcars_nest.

 > mtcars_nest
# A tibble: 8 x 6
    cyl  gear cyl_data          gear_data          plot_cyl plot_gear
  <dbl> <dbl> <list>            <list>             <list>   <list>   
1     6     4 <tibble [4 × 9]>  <tibble [12 × 10]> <S3: gg> <S3: gg> 
2     4     4 <tibble [8 × 9]>  <tibble [12 × 10]> <S3: gg> <S3: gg> 
3     6     3 <tibble [2 × 9]>  <tibble [15 × 10]> <S3: gg> <S3: gg> 
4     8     3 <tibble [12 × 9]> <tibble [15 × 10]> <S3: gg> <S3: gg> 
5     4     3 <tibble [1 × 9]>  <tibble [15 × 10]> <S3: gg> <S3: gg> 
6     4     5 <tibble [2 × 9]>  <tibble [5 × 10]>  <S3: gg> <S3: gg> 
7     8     5 <tibble [2 × 9]>  <tibble [5 × 10]>  <S3: gg> <S3: gg> 
8     6     5 <tibble [1 × 9]>  <tibble [5 × 10]>  <S3: gg> <S3: gg> 
  

Я попытался добавить:

 mtcars_nest <- mtcars_nest %>% 
  mutate(
    map(cyl_data, ~ ggplot(., aes(x = wt, y = mpg))   
          # geom_point()  
          geom_smooth(se = TRUE, color = 'blue'),
        gear_data, ~ ggplot(., aes(x = wt, y = mpg))   
          # geom_point()  
          geom_smooth(se = TRUE, color = 'red')
    )
  ) %>% 
  rename(plot_cyl_gear = `map(...)`)
  

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

Ответ №1:

Вы можете выполнять циклический просмотр двух разных наборов данных одновременно с map2() . Эта функция все еще используется в mutate() . (Фактически, вы могли бы создать все три набора графиков за один mutate() вызов, если бы захотели, поскольку вы можете называть новые столбцы по ходу работы.)

Первый набор данных используется .x при создании графика внутри map2() с помощью интерфейса formula, а второй — .y . В этом случае я определил один из наборов данных в глобальном, ggplot() а другой во втором geom_smooth() вызове для построения двух отдельных сглаживаний из разных наборов данных на одном графике.

 mtcars_nest = mtcars_nest %>% 
    mutate( 
        plot_cyl_gear = map2(cyl_data, gear_data,
                                 ~ ggplot(.x, aes(x = wt, y = mpg))  
                                     geom_smooth(se = TRUE, color = 'blue')  
                                     geom_smooth(data = .y, se = TRUE, color = 'red')
        ) )

mtcars_nest$plot_cyl_gear[1]
  

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

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

1. Фантастика! Большое спасибо!