Kevin's Data Analytics Blog

データサイエンティスト、AIエンジニアを目指す方に向けて情報発信していきます。

Pythonで動く棒グラフを作成する方法|Bar Chart Race

こんにちは。時系列で動く棒グラフをYoutube等で見かけたことがあると思いますが、先日、私も作成してみました。
youtu.be

Pythonで簡単に作れたので、作成手順を共有したいと思います。

想定環境

Windows8または、Windows10での実行を想定しています。

1. 事前準備

1-1. Pythonのセットアップ

Pythonを実行できる環境を用意します。同様のアニメーショングラフを作成できるWebサービスは複数ありますが、Pythonを使って書くメリットとしては、自分のパソコンで作成できる点です。業務データなど、オンラインにアップロードすることに抵抗がある場合にも、気にせずに作成することが出来ます。

もし、Pythonをまだインストールしていない方は、別の記事にしていますので、参考にしてみてください。
dskevin.hatenablog.com

1-2. FFmpegのインストール

1-2-1. ソフトウェアのダウンロード

以下のサイトにアクセスします。
Release ffmpeg git 2022-02-17 builds · GyanD/codexffmpeg · GitHub
f:id:dskevin:20210327160534p:plain:h320
ここで、「ffmpeg-2021-03-24-git-a77beea6c8-full_build.zip」を選択してダウンロードします。ファイル名のバージョンを表す部分は、本記事の作成時点のものになりますので、異なっていても問題ありません。

1-2-2. ファイルの解凍・コピー

ダウンロードが完了したらzipファイルを解凍して、解凍したフォルダを「C:\Program Files」配下にコピーします。
このとき、フォルダ名を「ffmpeg」に変更すると良いです。

1-2-3. 環境変数の設定

環境変数pathに先ほどコピーしたフォルダ内にある「bin」というフォルダを追加します。具体的には、以下のパスを追加します。
C:\Program Files\ffmpeg\bin

f:id:dskevin:20210327161356p:plain:h320

なお、環境変数については、以下の動画が参考になると思います。
youtu.be

1-3. ImageMagickのインストール

1-3-1. ソフトウェアのダウンロード

以下のサイトにアクセスします。
ImageMagick – Download
f:id:dskevin:20210327165135p:plain
ここで、「ImageMagick-7.0.11-4-portable-Q16-x64.zip」を選択してダウンロードします。先ほど同様、ファイル名のバージョンを表す部分は、本記事の作成時点のものになりますので、異なっていても問題ありません。

1-3-2. ファイルの解凍・コピー

ダウンロードが完了したらzipファイルを解凍して、解凍したフォルダを「C:\Program Files」配下にコピーします。
こちらも、先ほど同様、フォルダ名を「ImageMagick」に変更すると良いです。

1-3-3. Matplotlibの設定ファイルにパスを設定

ImageMagickの場合、Windows環境変数への設定は不要ですが、代わりにMatplotlibの設定ファイルにパスを設定する必要があります。

設定ファイルの場所:
<Matplotlibのインストールフォルダ>\mpl-data\matplotlibrc
※matplotlibのインストールフォルダ例:
 C:\Users\コンピュータ名\anaconda3\Lib\site-packages\matplotlib\

もし場所がわからなければ、以下のPythonプログラムを実行すれば確認できます。

import matplotlib
print(matplotlib.matplotlib_fname())

設定ファイルをメモ帳などのエディタで開いて、「animation.convert_path」の部分を以下の内容に書き換えます。
animation.convert_path: C:\Program Files\ImageMagick\magick.exe

変更前:
f:id:dskevin:20210327173642p:plain:h320
変更後:
f:id:dskevin:20210327173708p:plain:h320

1-4. Pythonのライブラリを追加

「bar_chart_race」というライブラリをインストールします。動く棒グラフは、Bar Chart Raceと呼ばれています。
通常、Pythonのライブラリはpip installコマンドでインストールできますが、ここでは、github上に公開されている最新バージョンをダウンロードしてインストールします。本記事の執筆時点では、bar_chart_raceのバージョン0.2が動く棒グラフをサポートしていますが、pip install でインストールするとバージョンが0.1になってしまうためです。

1-4-1. ファイルのダウンロード

以下のサイトにアクセスして、「Code」から「Download ZIP」を選択します。
GitHub - dexplo/bar_chart_race: Create animated bar chart races in Python with matplotlib
f:id:dskevin:20210411140356p:plain:h320

1-4-2. ファイルの解凍

ダウンロードが完了したらzipファイルを解凍します。こちらは、「C:\Program Files」配下へのコピーは不要です。

1-4-3. ライブラリの追加

コマンドプロンプトを開いて、zipファイルを解凍して生成されたフォルダに移動します。移動したら、「python setup.py install」と実行します。

cd フォルダのパス
python setup.py install

1-5. データファイルの用意

棒グラフを描画するためのデータを用意します。データは以下の形式になるように加工して、CSVファイルとして保存します。

  • それぞれの行は、ある1時点のデータを表します
  • 1列目は、日付など時間を表す項目とします
  • 2列目以降は、カテゴリごとのデータとします

例:プロ野球の各球団の勝利数の推移データ

date Giants Swallows Tigers Carp Dragons Baystars
2020-06-19 1 0 0 1 1 0
2020-06-20 2 1 0 2 1 0
2020-06-21 3 1 0 2 2 1

これで事前の準備は完了です。

2. Jupyter Notebookの起動

Pythonの実行環境を起動します。ここでは、Jupyter Notebookを使用します。他のPython実行環境でも問題ありません。

コマンドプロンプトから、以下のコマンドを実行します。

jupyter notebook

すると、ブラウザが立ち上がり、Jupyter Notebookが起動します。
Jupyter Notebookの使い方についても、別の記事にしていますので、参考にしてみてください。
dskevin.hatenablog.com

3. 動く棒グラフの作成

Pythonを実行して作成します。基本的には、コピー&ペーストすれば動くように、プログラムを書いています。
まず、ライブラリをインポートします。

import pandas as pd
import bar_chart_race as bcr

次に、先ほど用意した対象のデータファイルを読み込みます。target_fileという変数に、ファイルのパスを記載して実行します。相対パス絶対パスで記述することが可能ですが、あまり詳しくない場合は、プログラムファイルと同じフォルダに対象のファイルを置いて、ファイル名をシングルクォーテーション(’)で囲んで記述すればよいです。

# 対象のデータファイル
target_file = 'target_data.csv'

# CSVファイルの読み込み (最初の列をインデクスに指定)
df=pd.read_csv(target_file, index_col=0)

# データを確認
df.head()

f:id:dskevin:20210328221903p:plain

このように表形式のデータが表示されれば、ファイルの読み込みができています。
では、いよいよ、動く棒グラフを作成します。
以下の様に、bcr.bar_chart_raceという関数を実行します。

# bar_chart_raceの作成
bcr.bar_chart_race(df=df, n_bars=len(df.columns))

f:id:dskevin:20210410160057j:plain:h320
すると、このように、ノートブック内に動く棒グラフが表示されます。
動画を右クリックすると動画ファイルとして保存することができます。Jupyter Notebook以外の環境で実行する場合は、以下のように、関数の中にfilename='ファイル名'というオプションを追加すると、直接、動画ファイルに出力することができます。

bcr.bar_chart_race(df=df, n_bars=len(df.columns), filename='output.mp4')

また、ここで、棒グラフの見た目をカスタマイズすることができます。今回は、以下の内容を変更しました。
・タイトルを追加
・日付の位置を左下に変更
・バーの幅をやや細く
・バーの色を各球団のチームカラーに変更
f:id:dskevin:20210410162536j:plain:h320

Pythonコードは以下のとおりです。

# bar_chart_raceのカスタマイズ
bcr.bar_chart_race(
    df=df
    ,n_bars=len(df.columns)
    ,title='NPB Central League 2020'
    ,period_label={'x': 0.15, 'y': 0.03, 'ha': 'right', 'va': 'center', 'size': 7}
    ,bar_size=0.7
    ,colors=['#f97709', '#98c145', '#ffe201', '#ff0000', '#002569', '#094a8c']
)

他にもパラメータが多数用意されています。詳しくはこちらのページを参照ください。
https://www.dexplo.org/bar_chart_race/

まとめ

FFmpegとImageMagickの設定に少し時間がかかりましたが、Pythonのプログラムは思った以上に簡単でした。動く棒グラフを自分のPCで作成したいという方に、この記事が少しでも役に立てば幸いです。
記事の内容を実演した様子を動画にしてアップしています。文章で分かりづらい点は、こちらの動画もあわせてご確認ください。
youtu.be
動画を作成した際に使用したデータは、以下に公開しています。
セ・リーグ NPB_Central_2020.csv - Google ドライブ
パ・リーグ NPB_Pacific_2020.csv - Google ドライブ
これらは、私が自分でウェブサイトから過去の試合結果を探して入力・作成したデータです。そのため、内容に誤りがあるかもしれませんので、あらかじめご了承ください。

最後まで読んでいただき、ありがとうございました。