Plotting multiple plots using purrr::map and ggplot

1 Load packages

library(tidyverse)  # data wrangling

2 Sample data

mtcars to the rescue!

mtcars <- read_csv("https://vincentarelbundock.github.io/Rdatasets/csv/datasets/mtcars.csv")

3 Motivation

Say we have a data frame where we would like to plot each numeric variables’s distribution.

There are a number of good solutions outthere such as this one, or here, or here.

4 Way 1

mtcars %>% 
  select(where(is.numeric)) %>% 
  map( ~ {ggplot(mtcars, aes(x = .)) + geom_density()}
  )
#> $mpg
#> 
#> $cyl
#> 
#> $disp
#> 
#> $hp
#> 
#> $drat
#> 
#> $wt
#> 
#> $qsec
#> 
#> $vs
#> 
#> $am
#> 
#> $gear
#> 
#> $carb

Note that the chunks options above were like this:

{r fig.show="hold", out.width=70%"}

Works. But does not show the variable names. Next try.

5 Way 2

dens_fun <- function(var, name) {
  
  ggplot(mtcars, aes(x = var)) +
    geom_density() +
    labs(x = name,
         title = name)
}

mtcars %>% 
  select(where(is.numeric)) %>% 
  map2(.y = names(.),
       ~ dens_fun(.x, .y)
  )

6 Way 3

Now let’s assume with a character vector, cols, encompassing the columns to be processed.

cols <- c("mpg", "hp", "qsec")

To address a variable - eg., "hp", stored as a string, in recent tidyverse parlance should make use of .data[["hp"]].

dens_fun2 <- function(var_string) {
  
  ggplot(mtcars, aes(x = .data[[var_string]])) +
    geom_density() +
    labs(x = var_string,
         title = var_string)
}

See:

dens_fun2("hp")

Now let’s cycle through some columns:

cols %>% 
  map(~ dens_fun2(.x))
#> [[1]]
#> 
#> [[2]]
#> 
#> [[3]]

7 More general

Not all in life is mtcars. Let’s be more general.

And: there’s also the iris data set.

iris <- read_csv("https://vincentarelbundock.github.io/Rdatasets/csv/datasets/iris.csv")
dens_fun3 <- function(df, var_string) {
  
  ggplot(df, aes(x = .data[[var_string]])) +
    geom_density() +
    labs(x = var_string,
         title = var_string)
}
dens_fun3(iris, "Sepal.Length")

8 Introducing curly-curly

Or, alternatively, we can build our plot not with strings (character) variables as input, but bare, unquoted column names such as Sepal.Length.

This operator is called “curly curly”, as it consists of two curly braces.

For that purpose, we need to quote and evaluate the parameter, which is a buit unusual at the beginning:

dens_fun4 <- function(df, col) {
  
  ggplot(df, aes({{col}})) +
    geom_density() +
    labs(title = deparse(substitute(col)))
}

To make things worse, we need a string for the title lable.

iris %>% 
  dens_fun4(Sepal.Length)

iris %>% 
  select(where(is.numeric)) %>% 
  map(~ dens_fun4(iris, .))
#> $...1
#> 
#> $Sepal.Length
#> 
#> $Sepal.Width
#> 
#> $Petal.Length
#> 
#> $Petal.Width

Unfortunately, the title lab did not work out. We’ll fix that in some other post.

9 Reproducibility

#> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.1.0 (2021-05-18)
#>  os       macOS Big Sur 10.16         
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       Europe/Berlin               
#>  date     2022-01-11                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#>  package     * version date       lib source                           
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.1.0)                   
#>  backports     1.2.1   2020-12-09 [1] CRAN (R 4.1.0)                   
#>  blogdown      1.4     2021-07-23 [2] CRAN (R 4.1.0)                   
#>  bookdown      0.24.2  2021-10-15 [1] Github (rstudio/bookdown@ba51c26)
#>  broom         0.7.9   2021-07-27 [1] CRAN (R 4.1.0)                   
#>  bslib         0.3.1   2021-10-06 [1] CRAN (R 4.1.0)                   
#>  cachem        1.0.6   2021-08-19 [1] CRAN (R 4.1.0)                   
#>  callr         3.7.0   2021-04-20 [1] CRAN (R 4.1.0)                   
#>  cellranger    1.1.0   2016-07-27 [1] CRAN (R 4.1.0)                   
#>  cli           3.1.0   2021-10-27 [1] CRAN (R 4.1.0)                   
#>  codetools     0.2-18  2020-11-04 [2] CRAN (R 4.1.0)                   
#>  colorspace    2.0-2   2021-06-24 [1] CRAN (R 4.1.0)                   
#>  crayon        1.4.2   2021-10-29 [1] CRAN (R 4.1.0)                   
#>  DBI           1.1.1   2021-01-15 [1] CRAN (R 4.1.0)                   
#>  dbplyr        2.1.1   2021-04-06 [1] CRAN (R 4.1.0)                   
#>  desc          1.4.0   2021-09-28 [1] CRAN (R 4.1.0)                   
#>  devtools      2.4.2   2021-06-07 [1] CRAN (R 4.1.0)                   
#>  digest        0.6.29  2021-12-01 [1] CRAN (R 4.1.0)                   
#>  dplyr       * 1.0.7   2021-06-18 [1] CRAN (R 4.1.0)                   
#>  ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.1.0)                   
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 4.1.0)                   
#>  fansi         1.0.0   2022-01-10 [1] CRAN (R 4.1.0)                   
#>  farver        2.1.0   2021-02-28 [1] CRAN (R 4.1.0)                   
#>  fastmap       1.1.0   2021-01-25 [2] CRAN (R 4.1.0)                   
#>  forcats     * 0.5.1   2021-01-27 [1] CRAN (R 4.1.0)                   
#>  fs            1.5.0   2020-07-31 [1] CRAN (R 4.1.0)                   
#>  generics      0.1.1   2021-10-25 [1] CRAN (R 4.1.0)                   
#>  ggplot2     * 3.3.5   2021-06-25 [1] CRAN (R 4.1.0)                   
#>  glue          1.6.0   2021-12-17 [1] CRAN (R 4.1.0)                   
#>  gtable        0.3.0   2019-03-25 [1] CRAN (R 4.1.0)                   
#>  haven         2.4.1   2021-04-23 [1] CRAN (R 4.1.0)                   
#>  highr         0.9     2021-04-16 [1] CRAN (R 4.1.0)                   
#>  hms           1.1.1   2021-09-26 [1] CRAN (R 4.1.0)                   
#>  htmltools     0.5.2   2021-08-25 [1] CRAN (R 4.1.0)                   
#>  httr          1.4.2   2020-07-20 [1] CRAN (R 4.1.0)                   
#>  jquerylib     0.1.4   2021-04-26 [1] CRAN (R 4.1.0)                   
#>  jsonlite      1.7.2   2020-12-09 [1] CRAN (R 4.1.0)                   
#>  knitr         1.36    2021-09-29 [1] CRAN (R 4.1.0)                   
#>  labeling      0.4.2   2020-10-20 [1] CRAN (R 4.1.0)                   
#>  lifecycle     1.0.1   2021-09-24 [1] CRAN (R 4.1.0)                   
#>  lubridate     1.7.10  2021-02-26 [1] CRAN (R 4.1.0)                   
#>  magrittr      2.0.1   2020-11-17 [1] CRAN (R 4.1.0)                   
#>  memoise       2.0.0   2021-01-26 [2] CRAN (R 4.1.0)                   
#>  modelr        0.1.8   2020-05-19 [1] CRAN (R 4.1.0)                   
#>  munsell       0.5.0   2018-06-12 [1] CRAN (R 4.1.0)                   
#>  pillar        1.6.4   2021-10-18 [1] CRAN (R 4.1.0)                   
#>  pkgbuild      1.2.0   2020-12-15 [2] CRAN (R 4.1.0)                   
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.1.0)                   
#>  pkgload       1.2.3   2021-10-13 [1] CRAN (R 4.1.0)                   
#>  prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.1.0)                   
#>  processx      3.5.2   2021-04-30 [1] CRAN (R 4.1.0)                   
#>  ps            1.6.0   2021-02-28 [1] CRAN (R 4.1.0)                   
#>  purrr       * 0.3.4   2020-04-17 [1] CRAN (R 4.1.0)                   
#>  R6            2.5.1   2021-08-19 [1] CRAN (R 4.1.0)                   
#>  Rcpp          1.0.7   2021-07-07 [1] CRAN (R 4.1.0)                   
#>  readr       * 2.0.0   2021-07-20 [1] CRAN (R 4.1.0)                   
#>  readxl        1.3.1   2019-03-13 [1] CRAN (R 4.1.0)                   
#>  remotes       2.4.0   2021-06-02 [2] CRAN (R 4.1.0)                   
#>  reprex        2.0.0   2021-04-02 [1] CRAN (R 4.1.0)                   
#>  rlang         0.4.12  2021-10-18 [1] CRAN (R 4.1.0)                   
#>  rmarkdown     2.11    2021-09-14 [1] CRAN (R 4.1.0)                   
#>  rprojroot     2.0.2   2020-11-15 [2] CRAN (R 4.1.0)                   
#>  rstudioapi    0.13    2020-11-12 [1] CRAN (R 4.1.0)                   
#>  rvest         1.0.0   2021-03-09 [1] CRAN (R 4.1.0)                   
#>  sass          0.4.0   2021-05-12 [1] CRAN (R 4.1.0)                   
#>  scales        1.1.1   2020-05-11 [1] CRAN (R 4.1.0)                   
#>  sessioninfo   1.1.1   2018-11-05 [2] CRAN (R 4.1.0)                   
#>  stringi       1.7.5   2021-10-04 [1] CRAN (R 4.1.0)                   
#>  stringr     * 1.4.0   2019-02-10 [1] CRAN (R 4.1.0)                   
#>  testthat      3.1.0   2021-10-04 [1] CRAN (R 4.1.0)                   
#>  tibble      * 3.1.6   2021-11-07 [1] CRAN (R 4.1.0)                   
#>  tidyr       * 1.1.4   2021-09-27 [1] CRAN (R 4.1.0)                   
#>  tidyselect    1.1.1   2021-04-30 [1] CRAN (R 4.1.0)                   
#>  tidyverse   * 1.3.1   2021-04-15 [1] CRAN (R 4.1.0)                   
#>  tzdb          0.1.2   2021-07-20 [2] CRAN (R 4.1.0)                   
#>  usethis       2.0.1   2021-02-10 [2] CRAN (R 4.1.0)                   
#>  utf8          1.2.2   2021-07-24 [1] CRAN (R 4.1.0)                   
#>  vctrs         0.3.8   2021-04-29 [1] CRAN (R 4.1.0)                   
#>  withr         2.4.3   2021-11-30 [1] CRAN (R 4.1.0)                   
#>  xfun          0.28    2021-11-04 [1] CRAN (R 4.1.0)                   
#>  xml2          1.3.2   2020-04-23 [1] CRAN (R 4.1.0)                   
#>  yaml          2.2.1   2020-02-01 [1] CRAN (R 4.1.0)                   
#> 
#> [1] /Users/sebastiansaueruser/Library/R/x86_64/4.1/library
#> [2] /Library/Frameworks/R.framework/Versions/4.1/Resources/library