動くggplot2!

@fuuuumin

SappoRo.R #8 - 2018/02/24

イントロ

だれ?

  • fuuuumin @twitter (fuuumin314)
  • R歴 3年
  • 大学卒業間近

グラフを動かしたくないですか?

どうやって?

  • 今回はgapminderデータを使います
## Classes 'tbl_df', 'tbl' and 'data.frame':    1704 obs. of  6 variables:
##  $ country  : Factor w/ 142 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ continent: Factor w/ 5 levels "Africa","Americas",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ year     : int  1952 1957 1962 1967 1972 1977 1982 1987 1992 1997 ...
##  $ lifeExp  : num  28.8 30.3 32 34 36.1 ...
##  $ pop      : int  8425333 9240934 10267083 11537966 13079460 14880372 12881816 13867957 16317921 22227415 ...
##  $ gdpPercap: num  779 821 853 836 740 ...
country continent year lifeExp pop gdpPercap
Afghanistan Asia 1952 28.801 8425333 779.4453
Afghanistan Asia 1957 30.332 9240934 820.8530
Afghanistan Asia 1962 31.997 10267083 853.1007
Afghanistan Asia 1967 34.020 11537966 836.1971
Afghanistan Asia 1972 36.088 13079460 739.9811
Afghanistan Asia 1977 38.438 14880372 786.1134

時系列のlineplotだと

意図が分からない

動くグラフ

関数作って

  • まずyearを引数にとる関数を作る
plot_by_year <- function(yr) {
    p <- gapminder %>% 
        dplyr::filter(year == yr) %>% 
        ggplot(aes(x=gdpPercap, y=lifeExp, 
                   size=pop / 1e+06, color=continent)) +
        ggtitle(paste0(yr)) +
        geom_point(alpha=.8) +
        scale_x_log10(breaks=c(400, 1000, 4000, 10000, 40000, 100000)) +
        ylim(c(20, 90)) +
        scale_size_continuous(range=c(1, 13)) +  
        labs(x="GDP/capita", 
             y="Life expectancy (years)", 
             color="Continent", 
             size="Population (million)")
    return(p)
}

ループを回す

plot_ls <- gapminder %>% 
    dplyr::distinct(year) %>% 
    dplyr::pull() %>%  
    map(., plot_by_year)

plot_ls[[1]]

ただし、ggplotは軸を自動調整して しまうので手動で調整が必要

画像を合成してgifなどに

gganimateを使う

  • インストールはGithubから
  • 必要な要件をよく確認
  • 裏でImageMagickが動くので、Windowsは注意

devtools::install_github("dgrtwo/gganimate")

tweenr で補完

  • 滑らかなアニメーションのため
library(gganimate)
library(tweenr)
tw <- gapminder %>% 
    split(.$year) %>%  ## list of dfs by year 
    tweenr::tween_states(tweenlength=5, statelength=0, 
                         ease="cubic-in-out", nframes=200) %>% 
    dplyr::mutate(yr = floor(year))
##   country continent     year  lifeExp      pop gdpPercap .frame   yr
## 1   Japan      Asia 1952.000 63.03000 86459025  3216.956      1 1952
## 2   Japan      Asia 1952.003 63.03144 86462002  3217.598      2 1952
## 3   Japan      Asia 1952.023 63.04152 86482837  3222.092      3 1952
## 4   Japan      Asia 1952.079 63.06889 86539391  3234.288      4 1952
## 5   Japan      Asia 1952.187 63.12219 86649522  3258.039      5 1952
## 6   Japan      Asia 1952.364 63.21006 86831090  3297.197      6 1952

  • アニメーションを作るコード
anim <- ggplot(tw, aes(gdpPercap, lifeExp, size=pop / 1e+06, 
                       color=continent, frame=.frame)) + ...

gganimate(anim, interval=.1, title_frame=FALSE, 
          filename="./tmp/gapminder.gif")

k-means

結論

グラフが動くとなにが嬉しい?

  • 暗にグラフに第三の軸を付け加えられる
  • 聴衆を飽きさせない
  • カッコいい(大事)

どんなときに使える?

  • 時間軸を組み込みたいとき
  • アルゴリズムなど変化を強調するとき
  • 実況風にプレゼンしたいとき

参考資料など

reference

環境

devtools::session_info()[[1]]
##  setting  value                       
##  version  R version 3.4.3 (2017-11-30)
##  system   x86_64, linux-gnu           
##  ui       X11                         
##  language ja                          
##  collate  ja_JP.UTF-8                 
##  tz       Japan                       
##  date     2018-02-24

devtools::session_info()[[2]]
##  package    * version    date       source                           
##  animation    2.5        2017-03-30 cran (@2.5)                      
##  assertthat   0.2.0      2017-04-11 CRAN (R 3.4.3)                   
##  backports    1.1.2      2017-12-13 CRAN (R 3.4.3)                   
##  base       * 3.4.3      2017-12-01 local                            
##  base64enc    0.1-3      2015-07-28 CRAN (R 3.4.3)                   
##  bindr        0.1        2016-11-13 CRAN (R 3.4.3)                   
##  bindrcpp   * 0.2        2017-06-17 CRAN (R 3.4.3)                   
##  broom        0.4.3      2017-11-20 CRAN (R 3.4.3)                   
##  cellranger   1.1.0      2016-07-27 CRAN (R 3.4.3)                   
##  cli          1.0.0      2017-11-05 CRAN (R 3.4.3)                   
##  codetools    0.2-15     2016-10-05 CRAN (R 3.3.1)                   
##  colorspace   1.3-2      2016-12-14 cran (@1.3-2)                    
##  compiler     3.4.3      2017-12-01 local                            
##  crayon       1.3.4      2017-09-16 CRAN (R 3.4.3)                   
##  datasets   * 3.4.3      2017-12-01 local                            
##  devtools     1.13.5     2018-02-18 CRAN (R 3.4.3)                   
##  digest       0.6.15     2018-01-28 CRAN (R 3.4.3)                   
##  dplyr      * 0.7.4      2017-09-28 CRAN (R 3.4.3)                   
##  evaluate     0.10.1     2017-06-24 CRAN (R 3.4.3)                   
##  forcats    * 0.3.0      2018-02-19 CRAN (R 3.4.3)                   
##  foreign      0.8-69     2017-06-21 CRAN (R 3.4.0)                   
##  gapminder  * 0.3.0      2017-10-31 CRAN (R 3.4.3)                   
##  gganimate  * 0.1.0.9000 2018-02-23 Github (dgrtwo/gganimate@bf82002)
##  ggplot2    * 2.2.1      2016-12-30 cran (@2.2.1)                    
##  glue         1.2.0      2017-10-29 cran (@1.2.0)                    
##  graphics   * 3.4.3      2017-12-01 local                            
##  grDevices  * 3.4.3      2017-12-01 local                            
##  grid         3.4.3      2017-12-01 local                            
##  gtable       0.2.0      2016-02-26 cran (@0.2.0)                    
##  haven        1.1.1      2018-01-18 CRAN (R 3.4.3)                   
##  hms          0.4.1      2018-01-24 CRAN (R 3.4.3)                   
##  htmltools    0.3.6      2017-04-28 CRAN (R 3.4.3)                   
##  httr         1.3.1      2017-08-20 CRAN (R 3.4.3)                   
##  jsonlite     1.5        2017-06-01 CRAN (R 3.4.3)                   
##  knitr        1.19       2018-01-29 CRAN (R 3.4.3)                   
##  labeling     0.3        2014-08-23 cran (@0.3)                      
##  lattice      0.20-35    2017-03-25 CRAN (R 3.3.3)                   
##  lazyeval     0.2.1      2017-10-29 cran (@0.2.1)                    
##  lubridate    1.7.2      2018-02-06 CRAN (R 3.4.3)                   
##  magrittr     1.5        2014-11-22 CRAN (R 3.4.3)                   
##  memoise      1.1.0      2017-04-21 CRAN (R 3.4.3)                   
##  methods    * 3.4.3      2017-12-01 local                            
##  mnormt       1.5-5      2016-10-15 CRAN (R 3.4.3)                   
##  modelr       0.1.1      2017-07-24 CRAN (R 3.4.3)                   
##  munsell      0.4.3      2016-02-13 cran (@0.4.3)                    
##  nlme         3.1-131    2017-02-06 CRAN (R 3.4.0)                   
##  packrat      0.4.8-1    2016-09-07 CRAN (R 3.4.3)                   
##  parallel     3.4.3      2017-12-01 local                            
##  pillar       1.1.0      2018-01-14 CRAN (R 3.4.3)                   
##  pkgconfig    2.0.1      2017-03-21 CRAN (R 3.4.3)                   
##  plyr         1.8.4      2016-06-08 cran (@1.8.4)                    
##  psych        1.7.8      2017-09-09 CRAN (R 3.4.3)                   
##  purrr      * 0.2.4      2017-10-18 CRAN (R 3.4.3)                   
##  R6           2.2.2      2017-06-17 CRAN (R 3.4.3)                   
##  Rcpp         0.12.15    2018-01-20 CRAN (R 3.4.3)                   
##  readr      * 1.1.1      2017-05-16 CRAN (R 3.4.3)                   
##  readxl       1.0.0      2017-04-18 CRAN (R 3.4.3)                   
##  reshape2     1.4.3      2017-12-11 cran (@1.4.3)                    
##  revealjs     0.9        2017-03-13 CRAN (R 3.4.3)                   
##  rlang        0.2.0      2018-02-20 CRAN (R 3.4.3)                   
##  rmarkdown    1.8        2017-11-17 CRAN (R 3.4.3)                   
##  rprojroot    1.3-2      2018-01-03 CRAN (R 3.4.3)                   
##  rstudioapi   0.7        2017-09-07 CRAN (R 3.4.3)                   
##  rvest        0.3.2      2016-06-17 CRAN (R 3.4.3)                   
##  scales       0.5.0      2017-08-24 cran (@0.5.0)                    
##  stats      * 3.4.3      2017-12-01 local                            
##  stringi      1.1.6      2017-11-17 CRAN (R 3.4.3)                   
##  stringr    * 1.3.0      2018-02-19 cran (@1.3.0)                    
##  tibble     * 1.4.2      2018-01-22 CRAN (R 3.4.3)                   
##  tidyr      * 0.8.0      2018-01-29 CRAN (R 3.4.3)                   
##  tidyverse  * 1.2.1      2017-11-14 CRAN (R 3.4.3)                   
##  tools        3.4.3      2017-12-01 local                            
##  tweenr     * 0.1.5      2016-10-10 CRAN (R 3.4.3)                   
##  utils      * 3.4.3      2017-12-01 local                            
##  withr        2.1.1      2017-12-19 CRAN (R 3.4.3)                   
##  xml2         1.2.0      2018-01-24 CRAN (R 3.4.3)                   
##  yaml         2.1.16     2017-12-12 CRAN (R 3.4.3)