Translate

2020年1月25日土曜日

◆バーチャート・レースを作成する「R」コードの例です:プロ野球の球団別年間入場者数推移の場合

 日本野球機構が公表している、球団別年間入場者数データを用いて、バーチャート・レース(レーシング・バーチャート)の動画ファイルを作成する「R」のコードの一例です。「gganimate」を利用する方法です。

 やはり、データの前処理が重要ですが、「R」のコードは繰り返し作業に適していて、便利だと思います。

 コード化しておけば、処理を再現することが簡単・確実で、データ更新に即時に対応できます。また、コードは応用できるので、他のデータでのファイル作成に役立てることができます。

「R」コードで作成した動画ファイルに、編集ソフトでタイトルを入力したり、BGMを付けたりして完成です。





<データの前処理>
df_cent <- read.csv("central.csv")
df_cent <- as.data.frame(df_cent)
view(df_cent)

df_paci <- read.csv("pacificl.csv")
df_paci <- as.data.frame(df_paci)
df_paci <- df_paci[2:8]
view(df_paci)

df_cepa <- cbind(df_cent,df_paci)
view(df_cepa)

df_cepa <- df_cepa %>% mutate(year = paste0(year_n,"年"))
df_cepatidy <- df_cepa %>% gather(key=team,numbers,2:14)
view(df_cepatidy)

df_ceparank <- df_cepatidy %>%  group_by(year_n) %>% mutate(rank = rank(- numbers ),  Val_lbl = paste0(" ",numbers)) %>% group_by(year_n) %>%  filter(rank <= 12)
view(df_ceparank)

#折れ線グラフなどでの並び順を下記のコードで設定しています。棒グラフの色指定でも#この並び順を利用しています。

df_ceparank$team <- factor(df_ceparank$team,levels=c("読売ジャイアンツ","東京ヤクルトスワローズ","横浜DeNAベイスターズ","中日ドラゴンズ","阪神タイガース","広島東洋カープ","北海道日本ハムファイターズ","埼玉西武ライオンズ","千葉ロッテマリーンズ","大阪近鉄バファローズ","オリックスバファローズ","福岡ソフトバンクホークス","東北楽天ゴールデンイーグルス"))

<バーチャート・レースのグラフ作成>
grarank <-ggplot(df_ceparank,aes(x = rank, group = team))+ geom_tile(aes(y=numbers/2,height = numbers,fill = team,width = 0.8)) + scale_fill_manual(values=c("#F97709","#ED1A3D","#094a8c","#002569","#FFE201","#FF0000","#02518c","#102961","#221815","red","#b08f32","#f9ca00","#85010f"))+
labs(y=" ",title="プロ野球 セ・パ両リーグの球団別年間入場者数(1952年~2019年)",caption="日本野球機構のデータから") +
 geom_text(x = -10, y = 2750000,aes(label = year), size = 32, col = "navy") + geom_text(aes(y = 0, label = paste(team, " ")), vjust = 0.5, hjust =1, size = 6.75,face="bold",color="black")+
 geom_text(aes(y=numbers,label = Val_lbl,vjust = 0.95,hjust=0),size = 5.25 ) + coord_flip(clip = "off", expand = TRUE) + scale_x_reverse() +  theme_light() +  theme(legend.position = 'none')

#チーム名が長いので、図に収まるように、左側の余白を大きくします

grarank <- grarank + theme(axis.line=element_blank(),
        axis.text.x=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks=element_blank(),
        axis.title.x=element_text(colour="navy", size=18),
        axis.title.y=element_blank(),
        legend.position="none",
        panel.background=element_blank(),
        panel.border=element_blank(),
        panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(),
        panel.grid.major.x = element_line( size=.1, color="grey" ),
        panel.grid.minor.x = element_line( size=.1, color="grey" ),
        plot.title=element_text(size=32, hjust=0.5, face="bold", colour="black", vjust=-1),
        plot.subtitle=element_text(size=14, hjust=0.5, face="italic", color="black"),
        plot.caption =element_text(size=24, hjust=0.5, face="italic", color="black"),
        plot.background=element_blank(),
        plot.margin = margin(0.5,0.25,0.5,7, "cm"))
plot(grarank)
grarank <- grarank + transition_states(year, transition_length = 4, state_length = 1) + ease_aes('sine-in-out') + enter_fade() +  exit_fade()

animate(grarank, nframes = 300,fps = 20,start_pause = 20,duration = 60, width = 740, height = 520,renderer = gifski_renderer("cepa2019.gif"))

animate(grarank,nframes = 400,fps = 20,start_pause = 20,duration = 65, width = 1280, height = 720,renderer = ffmpeg_renderer())
gganimate::anim_save("cepa.mp4", animation = last_animation())


<折れ線グラフ作成>
ggplot(df_ceparank, aes(x=year_n, y=numbers,shape=team,colour=team)) + geom_line(aes(colour=team))+
  geom_point() +labs(x="year:日本野球機構のデータから",y="年間入場者数",title="プロ野球 セ・パ両リーグの年間入場者数の推移(1952年~2019年)") +  theme(legend.position="right")
------------------------------------------------------------------------------


-------------------------------------------------------------------------------

-------------------------------------------------------------------------------

2 件のコメント:

  1. 投稿を拝見しました。自分でRを使って作成してみたところ、animate()の前のtransition_statesで「関数"transition_states"を見つけることができませんでした」というエラーが出るのですが、あらかじめ関数は作られていますか?参考にさせていただきたいです。

    返信削除
    返信
    1. 返信が遅くなりました。今、コメントに気づきました。アニメーション関連のRパッケージでは、以下の二つを使っていたと思います。パッケージをインストールしていない場合は、インストールしてみてください。
      install.packages(gganimate)
      install.packages(gifski)
      library(gganimate)
      library(gifski)

      削除