みなさん、こんにちは!
みやしんです。今日はpythonでグラフを作成して、それを動画アニメーションにする方法をご紹介したいと思います。
pythonを使ってデータをグラフ化できると見た目が分かりやすくなっていいですね!
更に今回はそれを動画アニメーションにしてカッコよくしたいと思います。
初心者でも出来るようにサンプルコードをバッチリ付けていますので、ご安心くださいね^^
では、早速進めていきましょう!
データ準備 (DATA GO.JP)
まずは、データを準備しましょう!
データ準備はこちらの記事でも使っているDATA GO.JP データカタログサイトからダウンロードしてきました。
【リンク先】人口動態調査_人口動態統計_各定数_人口_年次_2019年
ダウンロードすると「mi040001.csv」というファイルがダウンロードされます。
今回は、このファイル名のまま使います。
データの事前処理
データをpythonで扱いやすくするために少し事前処理を行っておきます。
csvファイルを開きましょう。
まずはデータ以外の余分な部分を削除します。
すると、こんな感じになります。
続いて、データが欠落している部分にそれっぽいデータを入れておきます。
こんな感じで入れます。
これでデータの準備は完了です。
ではpythonでデータを読み込んでいきましょう!
pandasを使ったCSVファイル読み込み
本題に入っていきます。今回、jupyter notebookで書いたものをご紹介していきます。
また、コピペ用のスクリプトも是非ご活用ください。
まずは必要なライブラリをインポートします。
matplotlibでグラフを描く際に日本語が文字化けするが、japanize_matplotlibをインポートしておけば文字化けしないです。(まだライブラリをインストールしていない場合はpipインストールしましょう。pip install japanize-matplotlib)
コピー&ペースト用のサンプルコード
%matplotlib inline
# 必要なライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# mp4の動画化
import matplotlib.animation as animation
# 日本語の文字化け防止のためにjapanize_matplotlibをインポート
# 事前にインストールしておく(pip install japanize-matplotlib)
import japanize_matplotlib
df = pd.read_csv('C:\\Users\\JavaQuest\\Desktop\\csv_graph_movie\\mi040001.csv',
encoding='shift-jis',
header=0)
# Data Frameを確認
df
pandasのデータフレームをnumpy arrayに変換してデータ確認
グラフを作る際にx軸とするデータを確認します。
pandasで読み込んだデータをnumpy arrayに変換します。
x軸は都道府県名にしたいので、0列目のデータを指定します。
df.loc[行, 列]で抜き出す値を指定できます。df.loc[:, 列]とすると指定した1列全ての値を抜き取れます。つまり行を「:」で全て指定しているという形になります。
47×1の2次元配列をゲットしました。
このままだと後でこの配列を使いずらいので、1次元の配列に変換します。
reshapeを使って1×47の1次元配列に変換できました。
一旦、データ全体をnumpy arrayで読み込んで確認してみます。
途中のデータが「・・・」で省略されています。
全てのデータを見たい時は np.set_printoptions(threshold=np.inf) と書くと見れます。
「・・・」で省略されていた部分も全て表示されました。
データを確認すると、最初に県名があって人口データが年代が古い順に並んでいます。
続いて、データの形を確認しておきます。
47×22のnumpy arrayであることが確認できました。
データ処理のスキルアップにおススメ
上記のようなデータ処理のスキルアップをしたい方におススメです。
説明が詳しくサンプルも豊富です。良書だと思います。
pythonデータサイエンスハンドブック -Jupyter、Numpy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習
コピー&ペースト用のサンプルコード
# X軸のラベルを抽出
# df.loc[行, 列]で抜き出す値を指定。行は:で全指定。
np_x_axis=np.array(df.loc[:, ['Unnamed: 0']])
print(np_x_axis)
# 47×1の2次元配列になっているので、1×47の1次元配列に変換
np_x_axis=np_x_axis.reshape(47)
print(np_x_axis)
# 改めてデータを確認
np_all_data = np.array(df)
print(np_all_data)
# np,arrayを全て見たい時
# 省略せずに表示する
np.set_printoptions(threshold=np.inf)
print(np_all_data)
# データのshapeを確認しておく
df.shape
pandasでグラフ作成
まずは試しにグラフを描画します。
見栄えを良くするために折れ線グラフを棒グラフに変える。
x軸がIDになっているので、都道府県名に変える。
ここで最初の方でインポートしたjapanize_matplotlibをインポートしていないと、日本語が文字化けしてしまうので注意。
念のため年の開始(1935年)がどの列か確認しておく。
df.columns[1]から開始。
グラフの試し作成、確認はここで終わりです。何となく雰囲気が掴めましたのでグラフを清書していきます。グラフの清書はmatplotlibで行っていきます。
コピー&ペースト用のサンプルコード
# 試しにグラフにしてみる
df.plot()
# 折れ線グラフを棒グラフにしたい
df.plot(kind='bar')
# X軸がIDになっているので、都道府県名にしたい
df.plot(kind='bar', x=df.columns[0])
# 年の開始位置を確認しておく
df.columns[1]
matplotlibでグラフ作成
matplotlibでグラフを作っていきます。
今回、上下2段でグラフを作成します。上段は特に何もカスタマイズしないグラフ、下段は見易くカスタマイズしたグラフを描画して変化を比較できるようにしたいと思います。
また、元データから年数を間引いて1995年、2000年、2005年、2010年、2015年、2019年の6か年でグラフを作成します。
最終的には1000msec毎に年代が変わって各都道府県の人口グラフが表示される動画アニメーションを作っていきます。
コピー&ペースト用のサンプルコード
# 動画作成用の空リスト
image_list=[]
# グラフの枠を作る
# tight_layout=True はグラフが重ならずにキレイに枠内に収まるように自動調整。(テスト機能で効果があったり、なかったりするらしい)
# 背景を空色
fig = plt.figure(tight_layout=True, facecolor='skyblue')
# 枠内に2つのグラフを上下に作成
# 上のグラフは何もカスタマイズしないでグラフ表示(比較用)
# 下のグラフはキレイにカスタマイズ
Axes1 = fig.add_subplot(211, title='カスタマイズ前のグラフ')
Axes2 = fig.add_subplot(212, facecolor='yellow', title='カスタマイズ後_都道府県別の人口', ylabel='人口', xlabel="都道府県")
# X軸の文字列を縦書きにして文字の重なりを防止(Axes2のグラフのみ)
plt.setp(Axes2.get_xticklabels(), rotation=90, ha='right')
# 念のためグラフの重なり防止でtight_layout()を実施(効果があるかは不明)
plt.tight_layout()
# 都道府県毎のデータをピックアップ
# 全ての年代を取るとグラフが見にくくなるので絞る
# 1995年=12、2000年=13、2005年=14、2010年=15、2015年=17、2019年=21
for i in [12, 13, 14, 15, 17, 21]:
# 各年の棒グラフを作成
# Axes1の範囲にx軸(np_x_axis)、y軸(np_all_data[:,i])の棒グラフを作成
graph1 = Axes1.bar(np_x_axis, np_all_data[:,i])
# 同上
graph2 = Axes2.bar(np_x_axis, np_all_data[:,i])
# 凡例を付与する
fig.legend(labels=['1995年','2000年','2005年','2010年','2015年','2019年'])
# 動画作成用のリストにグラフデータを格納する
image_list.append(graph1+graph2)
animation.ArtistAnimationを使ってグラフの動画アニメーション作成
最後に作ったグラフを動画アニメーションにします。
animation.ArtistAnimationを使ってmp4の動画を作ります。
1000msec毎に年代が変わって各都道府県の人口グラフが表示される動画アニメーションになっています。
完成になります。
コピー&ペースト用のサンプルコード
# animation.ArtistAnimationで動画化
# fig(グラフの枠)、image_list(グラフのリスト)と各グラフを何秒表示するか(interval= [msec])を引数とする
ani = animation.ArtistAnimation(fig, image_list, interval=1000)
# 動画(mp4)を保存
# 事前にffmpeg-pythonのインストールが必要 (pip install ffmpeg-python or conda install ffmpeg-python)
ani.save('Graph_Animation.mp4', writer='ffmpeg')
以上になります。
ありがとうございました。
コメント