从嵌套的小标题上的一个图上绘制两个数据列表

时间:2019-03-21 17:08:19

标签: r ggplot2 nested 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的想法?我真正需要的是在mtcars_nest标题中添加另一个gg列表,以便最终得到mtcars_nest中的cyl,gear,cyl_data,gear_data,plot_cyl,plot_gear和plot_cyl_gear这样的结构。

> 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 个答案:

答案 0 :(得分:1)

使用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