はじめに
グラフをアニメーションにすることで、静的なグラフでは得られなった、気づきを与えてくれます。
さらには、ある時系列の動的な変化を眺めることで、データのダイナミクスをより正確に感じれます。
同ブログは、「アニメーショングラフ」推しです。
YouTubeを見てて、以前から近いものを作りたいと思ってて、 この記事では、「バー・チャート・レース」を取り上げてみます。
第一弾として、アニメーショングラフにするデータは、日経平均(日経225)の時系列データ(日足)を使います。
さぁ、アニメーショングラフを設定していきましょう。
実行環境
macOS Big Sur (バージョン11.5.2) MacBook Air (M1, 2020) チップ Apple M1 メモリ 16GB
Rパッケージの準備
関連のRパッケージを準備します。結構あります。 ここをスキップして、以下のスクリプトを読み込むのでもOKです。
#パッケージ・インストール pack <- c("rvest", "quantmod", "magrittr", "purrr", "tidyr", "ggplot2", "treemapify", "gganimate", "gapminder", "gifski") install.packages(pack[!(pack %in% unique(rownames(installed.packages())))]) #ロード for(n in 1:length(pack)){ eval(parse(text = paste0("library(", pack[n], ")"))); rm("n") }
以下のgetNikkei225.Rスクリプトを読み込んでも、Rパッケージがインストールできます。
同時に、今回使用する、getNikkei225_list、Nikkei225_ChartData、Nikkei225_ChartData_mod、Nikkei225_animationといった関数群を読み込みます。
#関連関数群の読み込み source("https://gist.githubusercontent.com/kumeS/c9883239311546c5ab1753676fa86514/raw/4c7a3a6c2520afdf7dc0e56c1fc5a161ce74ee20/getNikkei225.R")
ではでは、早速、実行してみましょう。
日経225銘柄のデータ取得
まず、getNikkei225_list関数では、ウェブスクレイピングを介して、ウィキペディアの該当ページから日経225の銘柄リストを取得します。時々、ページが更新されて、表の構成が変わるので、厄介です・・・
そして、次に、Nikkei225_ChartData関数でデータを取得します。
#Wikipediaページから日経225銘柄リストを取得する Nikkei225List <- getNikkei225_list() #表示 head(Nikkei225List) # Ticker Company Sector #1 2002 日清製粉グループ本社 食品 #2 2269 明治ホールディングス 食品 #3 2282 日本ハム 食品 #4 2501 サッポロホールディングス 食品 #5 2502 アサヒグループホールディングス 食品 #6 2503 キリンホールディングス 食品 #銘柄のセクター数 table(Nikkei225List$Sector) #日経225のデータ取得: 実行時間 5分くらい ChartData <- Nikkei225_ChartData(Dat=Nikkei225List, term=c("2022-01-01", "2022-12-31")) #いったん、RDS保存 saveRDS(ChartData, "Nikkei225_ChartData.Rds") #ChartData0 <- readRDS("Nikkei225_ChartData.Rds") #または、Nikkei225_ChartData.Rdsをダウンロードできるようにもしています。 #system("which svn") #system("svn export https://github.com/kumeS/Blog/trunk/R_BarChart/Nikkei225_ChartData.Rds") #表示 head(ChartData0) # Company Ticker Sector date close dclose dclose2 ranking #1 日清製粉グループ本社 2002 食品 2022-01-04 100 0 #F0F5F0 1 #2 明治ホールディングス 2269 食品 2022-01-04 100 0 #F0F5F0 2 #3 日本ハム 2282 食品 2022-01-04 100 0 #F0F5F0 3 #4 サッポロホールディングス 2501 食品 2022-01-04 100 0 #F0F5F0 4 #5 アサヒグループホールディングス 2502 食品 2022-01-04 100 0 #F0F5F0 5 #6 キリンホールディングス 2503 食品 2022-01-04 100 0 #F0F5F0 6
このステップで、日経225のうちで、224銘柄のリストとデータが取得できました。
日経225銘柄でのバー・チャート・レース
日経225 上位20銘柄でのバー・チャート・レース作成
次に、日経225の上昇20銘柄に絞って、バー・チャート・レースを作成します。
Nikkei225_ChartData_mod関数の引数「top = 20」で、日経225の上昇20銘柄のデータフレームにします。 次に、Nikkei225_animation関数を実行して、チャート設定をします。また、日本語設定も別途します。
#データ補正: 上位20銘柄を取得する ChartData1 <- Nikkei225_ChartData_mod(ChartData0, top = 20) #表示 head(ChartData1) # Company Ticker Sector CompanyTicker #8353 DOWAホールディングス 5714 非鉄金属・金属製品 DOWAホールディングス(5714) #8577 DOWAホールディングス 5714 非鉄金属・金属製品 DOWAホールディングス(5714) #8801 DOWAホールディングス 5714 非鉄金属・金属製品 DOWAホールディングス(5714) #9025 DOWAホールディングス 5714 非鉄金属・金属製品 DOWAホールディングス(5714) #9249 DOWAホールディングス 5714 非鉄金属・金属製品 DOWAホールディングス(5714) #9473 DOWAホールディングス 5714 非鉄金属・金属製品 DOWAホールディングス(5714) # CompanySector date close dclose dclose2 ranking #8353 DOWAホールディングス(非鉄金属・金属製品) 2022-03-01 111.7 11.7 #F0F5F0 17 #8577 DOWAホールディングス(非鉄金属・金属製品) 2022-03-02 118.9 18.9 #D2E3D2 10 #8801 DOWAホールディングス(非鉄金属・金属製品) 2022-03-03 125.3 25.3 #D2E3D2 8 #9025 DOWAホールディングス(非鉄金属・金属製品) 2022-03-04 122.0 22.0 #D2E3D2 8 #9249 DOWAホールディングス(非鉄金属・金属製品) 2022-03-07 122.0 22.0 #D2E3D2 11 #9473 DOWAホールディングス(非鉄金属・金属製品) 2022-03-08 112.7 12.7 #F0F5F0 12 #日本語設定(???) #ggplot2::update_geom_defaults("text", list(family = "HiraKakuPro-W3")) #ggplot2::update_geom_defaults("label", list(family = "HiraKakuPro-W3")) ##実行 p1 <- Nikkei225_animation(ChartData1, Label="Nikkei225 Top 20 銘柄") #gif出力: 実行時間 30秒くらい animate(p1, fps = 2, duration = 125, width = 600, height = 600, renderer = gifski_renderer("Nikkei225_BarChartRace_animation_p1.gif"))
日経225 下位20銘柄でのバー・チャート・レース作成
次に、日経225の下位20銘柄に絞って、バー・チャート・レースを作成します。
ここで、Nikkei225_ChartData_mod関数の引数「top = -20」でマイナス設定にすると 日経225の下位20銘柄のデータフレームを得ます。
#データ補正: 下位20銘柄を取得する ChartData2 <- Nikkei225_ChartData_mod(ChartData0, top = -20) #日本語設定(???) #ggplot2::update_geom_defaults("text", list(family = "HiraKakuPro-W3")) #ggplot2::update_geom_defaults("label", list(family = "HiraKakuPro-W3")) ##実行: marの`unit(c(top, right, bottom, left), "cm")`のc(top, right, bottom, left)に対応 p2 <- Nikkei225_animation(ChartData2, Label="Nikkei225 Lowest 20 銘柄", mar=c(0.5, 1.5, 0.5, 0.75), Size1=4, Size2=5) #gif出力: 実行時間 30秒くらい animate(p2, fps = 2, duration = 125, width = 600, height = 600, renderer = gifski_renderer("Nikkei225_BarChartRace_animation_p2.gif"))
まとめ
今回、日経225銘柄の2022年11月まで値動きのバー・チャート・レースを作成しました。 よく眺めてみると、日本株も結構上昇している銘柄が多い印象ですね。。
実際のチャート設定としては、レースへの参加者数、つまりはグループ数が多いと、レースのアニメーションはシンプルにした方がいいかも知れないと思うところです。
また、設定を間違い、レンダリングにかなり時間が取られ、今回は日経225のみでタイムオーバーでした。