【问题标题】:Plotting from two data lists on one figure from a nested tibble从嵌套小标题的一个图形上的两个数据列表中绘图
【发布时间】:2019-08-12 14:54:11
【问题描述】:

我有一个包含多个数据列表的嵌套列表。我可以在自己的图形上绘制每个数据源,但我一直试图在单个图形中从每个数据源中获得一条相互叠加的平滑线。这是使用 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 tibble 中添加另一个 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(地图函数中的第一个数据源。

【问题讨论】:

    标签: r ggplot2 nested tidyr


    【解决方案1】:

    使用map2() 可以同时循环遍历两个不同的数据集。在mutate() 中仍然使用此功能。 (事实上​​,如果您愿意,您可以在一个 mutate() 调用中制作所有三组图,因为您可以随时命名新列。)

    使用公式界面在map2()内创建绘图时,第一个数据集是.x,第二个数据集是.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]
    

    【讨论】:

    • 太棒了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 2014-03-18
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多