Rを使用してアニメーションヒストグラムを作成する





任意のサイトの出版物に直接埋め込むことができるアニメーションヒストグラムは、ますます人気が高まっています。 特定の時間における特性の変化のダイナミクスを表示し、明確に行います。 Rおよびユニバーサルパッケージを使用してそれらを作成する方法を見てみましょう。



Skillboxの推奨事項: Python開発者のゼロからの 実践コース。



「Habr」の読者には、「Habr」プロモーションコードを使用してSkillboxコースに登録すると10,000ルーブルの割引があります。


パッケージ



Rのパッケージが必要です。





これら2つは不可欠です。 さらに、データの管理、配列のクリア、フォーマットには、それぞれ整頓、管理、スケールが必要です。



データ



このプロジェクトで使用する元のデータセットは、世界銀行のWebサイトからダウンロードされます。 ここにあります-WorldBank Data 。 同じデータが完成した形で必要な場合は、 プロジェクトフォルダーからダウンロードできます



この情報は何ですか? サンプルには、数年(2000年から2017年まで)にわたるほとんどの国のGDPの値が含まれています。



データ処理



以下のコードを使用して、必要なデータ形式を準備します。 列名をクリアし、数値を数値形式に変換し、gather()関数を使用してデータを変換します。 受信したものはすべて、将来の使用に備えてgdp_tidy.csvに保存されます。



library(tidyverse) library(janitor) gdp <- read_csv("./data/GDP_Data.csv") #select required columns gdp <- gdp %>% select(3:15) #filter only country rows gdp <- gdp[1:217,] gdp_tidy <- gdp %>% mutate_at(vars(contains("YR")),as.numeric) %>% gather(year,value,3:13) %>% janitor::clean_names() %>% mutate(year = as.numeric(stringr::str_sub(year,1,4))) write_csv(gdp_tidy,"./data/gdp_tidy.csv")
      
      





アニメーション化された棒グラフ



作成には2つの段階が必要です。





最後の手順は、GIFまたはMP4を含む目的の形式でアニメーションをレンダリングすることです。



ライブラリの読み込み





データ管理



このステップでは、データをフィルタリングして、毎年上位10か国を取得する必要があります。 ヒストグラムの凡例を表示できる列をいくつか追加します。



 gdp_tidy <- read_csv("./data/gdp_tidy.csv") gdp_formatted <- gdp_tidy %>% group_by(year) %>% # The * 1 makes it possible to have non-integer ranks while sliding mutate(rank = rank(-value), Value_rel = value/value[rank==1], Value_lbl = paste0(" ",round(value/1e9))) %>% group_by(country_name) %>% filter(rank <=10) %>% ungroup()
      
      





静的ヒストグラムの構築



データパケットが目的の形式になったので、静的なヒストグラムの描画を開始します。 基本情報-選択した時間間隔で最大GDPを記録した上位10か国。 毎年チャートを作成しています。



 staticplot = ggplot(gdp_formatted, aes(rank, group = country_name, fill = as.factor(country_name), color = as.factor(country_name))) + geom_tile(aes(y = value/2, height = value, width = 0.9), alpha = 0.8, color = NA) + geom_text(aes(y = 0, label = paste(country_name, " ")), vjust = 0.2, hjust = 1) + geom_text(aes(y=value,label = Value_lbl, hjust=0)) + coord_flip(clip = "off", expand = FALSE) + scale_y_continuous(labels = scales::comma) + scale_x_reverse() + guides(color = FALSE, fill = FALSE) + theme(axis.line=element_blank(), axis.text.x=element_blank(), axis.text.y=element_blank(), axis.ticks=element_blank(), axis.title.x=element_blank(), 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=25, hjust=0.5, face="bold", colour="grey", vjust=-1), plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="grey"), plot.caption =element_text(size=8, hjust=0.5, face="italic", color="grey"), plot.background=element_blank(), plot.margin = margin(2,2, 2, 4, "cm"))
      
      





ggplot2を使用してグラフを作成するのは非常に簡単です。 上記のコードセクションでわかるように、テーマ()関数にはいくつかの重要なポイントがあります。 すべての要素を問題なくアニメーション化するために必要です。 それらの一部は、必要に応じて表示されない場合があります。 例:垂直グリッド線と凡例のみが描画されますが、軸の見出しといくつかのコンポーネントがプロットから削除されます。



アニメーション



ここで重要な機能はtransition_states()で、個別の静的グラフを接着します。 view_follow()は、グリッド線の描画に使用されます。



 anim = staticplot + transition_states(year, transition_length = 4, state_length = 1) + view_follow(fixed_x = TRUE) + labs(title = 'GDP per Year : {closest_state}', subtitle = "Top 10 Countries", caption = "GDP in Billions USD | Data Source: World Bank Data")
      
      





レンダリング



アニメーションを作成してアニメーションオブジェクトに保存したら、animate()関数を使用してレンダリングします。 animate()で使用されるレンダラーは、必要な出力ファイルのタイプによって異なる場合があります。



GIF



 # For GIF animate(anim, 200, fps = 20, width = 1200, height = 1000, renderer = gifski_renderer("gganim.gif"))
      
      





Mp4



 # For MP4 animate(anim, 200, fps = 20, width = 1200, height = 1000, renderer = ffmpeg_renderer()) -> for_mp4 anim_save("animation.mp4", animation = for_mp4 )
      
      





結果







ご覧のとおり、複雑なことは何もありません。 プロジェクト全体が私のGitHubで利用可能です。あなたが適切と思うようにそれを使うことができます。



Skillboxの推奨事項:






All Articles