Построение двух списков данных на одной фигуре из вложенной таблицы - PullRequest
1 голос
/ 21 марта 2019

У меня есть вложенный список с несколькими списками данных. Я могу нанести каждый источник данных на отдельную фигуру, но я застрял, пытаясь получить сглаживающую линию от каждого источника данных друг над другом на одной фигуре. Вот пример кода с использованием набора данных 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, чтобы в итоге я получил такую ​​структуру, как 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 синим цветом (первый источник данных в функции карты.

1 Ответ

1 голос
/ 22 марта 2019

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

Первый набор данных .x при созданииграфик в пределах map2() с интерфейсом формулы, а второй - .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]

enter image description here

...