ggplot でのDRY

SendaiR 01 @fuuuumin

18 / 05 / 2019

Introduction

whoami

fuuuumin314

@twitter

研修医

R歴: 5年, 臨床データの解析

DRY: Don’t Repeat Yourself

  • 同じコードの繰り返しを避ける
  • 可読性
  • 再利用性

demo data

  • survival::pbc
  • 肝臓の病気に対する治療データ

Setting themes

基本的なplot

pbc %>% 
  dplyr::filter(!is.na(trt)) %>% 
  ggplot(aes(factor(trt), albumin, fill=factor(trt))) + 
    geom_boxplot()

plotできたけど……

  • 全体的にフォントが小さい
  • 背景のグレーを白地にしたい
  • 罫線を消したい
  • 判例を消したい

など共通で設定したい事項がある

修正してみる

pbc %>% 
  dplyr::filter(!is.na(trt)) %>% 
  ggplot(aes(factor(trt), albumin, fill=factor(trt))) + 
    geom_boxplot() +
    theme_bw() +
    theme(axis.text=element_text(size=16), 
          axis.title=element_text(size=18, face="bold"), 
          legend.position="none")

比較

共通の設定にするには

theme_set()

my_theme <- theme_bw() + 
  theme(axis.text=element_text(size=16), 
    axis.title=element_text(size=18, face="bold"),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    legend.position="none")
theme_set(my_theme)
pbc %>% 
  dplyr::filter(!is.na(trt)) %>% 
  ggplot(aes(factor(trt), bili, fill=factor(trt))) +
  geom_boxplot()

Writing functions

ggplotで関数を作る

pbc$trt <- as.factor(pbc$trt)
pbc_box_func <- function(x, y) {
  theme_set(my_theme)
  pbc %>% 
    filter(!is.na(!!sym(x))) %>% 
    ggplot(aes(x = !!sym(x), y = !!sym(y))) +
    geom_boxplot()
}
pbc_box_func("trt", "bili")

Utilizing purrr

map で繰り返しを避ける

my_vars <- set_names(c("bili", "chol", "albumin", "ast"))
dry_plots <- purrr::map(my_vars, ~pbc_box_func("trt", .x))

dry_plots[[1]]

# same as dry_plots$bili

dry_plots[[2]]
## Warning: Removed 28 rows containing non-finite values (stat_boxplot).

dry_plots[[3]]

dry_plots[[4]]

まとめ

  • 共通の設定を使うときにはset_theme()
  • ggplotで関数を作るときは注意が必要

詳しくはtidy evaluationで検索

  • 関数を繰り返すときはpurrr::map()

Appendix

reference

Environment info

devtools::session_info()[[1]]
##  setting  value                       
##  version  R version 3.6.0 (2019-04-26)
##  os       Ubuntu 18.04.2 LTS          
##  system   x86_64, linux-gnu           
##  ui       X11                         
##  language ja                          
##  collate  ja_JP.UTF-8                 
##  ctype    ja_JP.UTF-8                 
##  tz       Asia/Tokyo                  
##  date     2019-05-18

devtools::session_info()[[2]]
##  package     * version  date       lib source        
##  assertthat    0.2.1    2019-03-21 [1] CRAN (R 3.6.0)
##  backports     1.1.4    2019-04-10 [1] CRAN (R 3.6.0)
##  broom         0.5.2    2019-04-07 [1] CRAN (R 3.6.0)
##  callr         3.2.0    2019-03-15 [1] CRAN (R 3.6.0)
##  cellranger    1.1.0    2016-07-27 [1] CRAN (R 3.6.0)
##  cli           1.1.0    2019-03-19 [1] CRAN (R 3.6.0)
##  codetools     0.2-16   2018-12-24 [4] CRAN (R 3.5.2)
##  colorspace    1.4-1    2019-03-18 [1] CRAN (R 3.6.0)
##  crayon        1.3.4    2017-09-16 [1] CRAN (R 3.6.0)
##  desc          1.2.0    2018-05-01 [1] CRAN (R 3.6.0)
##  devtools      2.0.2    2019-04-08 [1] CRAN (R 3.6.0)
##  digest        0.6.18   2018-10-10 [1] CRAN (R 3.6.0)
##  dplyr       * 0.8.0.1  2019-02-15 [1] CRAN (R 3.6.0)
##  evaluate      0.13     2019-02-12 [1] CRAN (R 3.6.0)
##  forcats     * 0.4.0    2019-02-17 [1] CRAN (R 3.6.0)
##  fs            1.2.7    2019-03-19 [1] CRAN (R 3.6.0)
##  gapminder   * 0.3.0    2017-10-31 [1] CRAN (R 3.6.0)
##  generics      0.0.2    2018-11-29 [1] CRAN (R 3.6.0)
##  ggplot2     * 3.1.1    2019-04-07 [1] CRAN (R 3.6.0)
##  glue          1.3.1    2019-03-12 [1] CRAN (R 3.6.0)
##  gtable        0.3.0    2019-03-25 [1] CRAN (R 3.6.0)
##  haven         2.1.0    2019-02-19 [1] CRAN (R 3.6.0)
##  hms           0.4.2    2018-03-10 [1] CRAN (R 3.6.0)
##  htmltools     0.3.6    2017-04-28 [1] CRAN (R 3.6.0)
##  httr          1.4.0    2018-12-11 [1] CRAN (R 3.6.0)
##  jsonlite      1.6      2018-12-07 [1] CRAN (R 3.6.0)
##  knitr         1.22     2019-03-08 [1] CRAN (R 3.6.0)
##  labeling      0.3      2014-08-23 [1] CRAN (R 3.6.0)
##  lattice       0.20-38  2018-11-04 [4] CRAN (R 3.5.1)
##  lazyeval      0.2.2    2019-03-15 [1] CRAN (R 3.6.0)
##  lubridate     1.7.4    2018-04-11 [1] CRAN (R 3.6.0)
##  magrittr      1.5      2014-11-22 [1] CRAN (R 3.6.0)
##  Matrix        1.2-17   2019-03-22 [4] CRAN (R 3.5.3)
##  memoise       1.1.0    2017-04-21 [1] CRAN (R 3.6.0)
##  modelr        0.1.4    2019-02-18 [1] CRAN (R 3.6.0)
##  munsell       0.5.0    2018-06-12 [1] CRAN (R 3.6.0)
##  nlme          3.1-139  2019-04-09 [4] CRAN (R 3.5.3)
##  pillar        1.3.1    2018-12-15 [1] CRAN (R 3.6.0)
##  pkgbuild      1.0.3    2019-03-20 [1] CRAN (R 3.6.0)
##  pkgconfig     2.0.2    2018-08-16 [1] CRAN (R 3.6.0)
##  pkgload       1.0.2    2018-10-29 [1] CRAN (R 3.6.0)
##  plyr          1.8.4    2016-06-08 [1] CRAN (R 3.6.0)
##  prettyunits   1.0.2    2015-07-13 [1] CRAN (R 3.6.0)
##  processx      3.3.0    2019-03-10 [1] CRAN (R 3.6.0)
##  ps            1.3.0    2018-12-21 [1] CRAN (R 3.6.0)
##  purrr       * 0.3.2    2019-03-15 [1] CRAN (R 3.6.0)
##  R6            2.4.0    2019-02-14 [1] CRAN (R 3.6.0)
##  Rcpp          1.0.1    2019-03-17 [1] CRAN (R 3.6.0)
##  readr       * 1.3.1    2018-12-21 [1] CRAN (R 3.6.0)
##  readxl        1.3.1    2019-03-13 [1] CRAN (R 3.6.0)
##  remotes       2.0.4    2019-04-10 [1] CRAN (R 3.6.0)
##  revealjs      0.9      2017-03-13 [1] CRAN (R 3.6.0)
##  rlang         0.3.4    2019-04-07 [1] CRAN (R 3.6.0)
##  rmarkdown     1.12     2019-03-14 [1] CRAN (R 3.6.0)
##  rprojroot     1.3-2    2018-01-03 [1] CRAN (R 3.6.0)
##  rstudioapi    0.10     2019-03-19 [1] CRAN (R 3.6.0)
##  rvest         0.3.3    2019-04-11 [1] CRAN (R 3.6.0)
##  scales        1.0.0    2018-08-09 [1] CRAN (R 3.6.0)
##  sessioninfo   1.1.1    2018-11-05 [1] CRAN (R 3.6.0)
##  stringi       1.4.3    2019-03-12 [1] CRAN (R 3.6.0)
##  stringr     * 1.4.0    2019-02-10 [1] CRAN (R 3.6.0)
##  survival    * 2.44-1.1 2019-04-01 [1] CRAN (R 3.6.0)
##  tibble      * 2.1.1    2019-03-16 [1] CRAN (R 3.6.0)
##  tidyr       * 0.8.3    2019-03-01 [1] CRAN (R 3.6.0)
##  tidyselect    0.2.5    2018-10-11 [1] CRAN (R 3.6.0)
##  tidyverse   * 1.2.1    2017-11-14 [1] CRAN (R 3.6.0)
##  usethis       1.5.0    2019-04-07 [1] CRAN (R 3.6.0)
##  withr         2.1.2    2018-03-15 [1] CRAN (R 3.6.0)
##  xfun          0.6      2019-04-02 [1] CRAN (R 3.6.0)
##  xml2          1.2.0    2018-01-24 [1] CRAN (R 3.6.0)
##  yaml          2.2.0    2018-07-25 [1] CRAN (R 3.6.0)
## 
## [1] /home/fuuuumin/R/x86_64-pc-linux-gnu-library/3.6
## [2] /usr/local/lib/R/site-library
## [3] /usr/lib/R/site-library
## [4] /usr/lib/R/library