サッカーを通じて観戦力と分析力を上げていくブログ

基本的にはサッカー×データに関して試してみたことをまとめています。最近はもっぱらPythonを使った可視化中心。時々自分の好きなガジェットも。

【Python】matplotlibで色々な棒グラフを描画してみる

以前の記事で作成したmatplotlibを使った様々な棒グラフの描画方法について、今回も備忘録を兼ねて記載しておきます。

96lovefootball.hatenablog.com

matplotlibの概略

くどいですがmatplotlibの概略です。matplotlibとはPython用のグラフ描画ライブラリで、これを使うことで様々なグラフが比較的簡単に描けるようになります。(棒グラフ程度ではその利点をほぼ行かせていません。。)ちょっと癖のあるmatplotlibを使った描画の考え方については、以前の記事で簡単にまとめていますので、こちらも参考にして見てください。

96lovefootball.hatenablog.com

matplotlibを使う準備として、各種ライブラリをインポートしておきます。「%matplotlib inline」はGoogle Colab等の環境でグラフを表示させるためのおまじないです。

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

積み上げ棒グラフを描画する

f:id:virgilvd:20190127104353p:plain

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(1,1,1)

ax.bar(df_lfc['Matchweek'], df_lfc['Liv Pass Backward'], width=0.25, color='turquoise', label='Liv Pass Backward')
ax.bar(df_lfc['Matchweek'], df_lfc['Liv Pass Forward'], width=0.25, bottom=df_lfc['Liv Pass Backward'], color='salmon', label='Liv Pass Forward')

ax.set_xticks(df_lfc['Matchweek'])
ax.set_xticklabels(df_lfc['Opp Abbreviation'])

ax.set_ylabel('Pass Direction')

plt.legend()
plt.show()

上のグラフは、前方へのパス数と後方へのパス数を試合毎に積み上げたものになっています。matplotlibでは.bar( )で棒グラフを描画することができます。引数widthで棒の幅、colorで棒の色を指定することが出来ます。colorに関しては、折れ線グラフと同様の値が使えますのでこちらも参考にしてください。 

96lovefootball.hatenablog.com

 積み上げ棒グラフを描画したい場合は、棒の下側の余白を決める引数bottomを使用します。上の例では、後方へのパス数を表した棒グラフ(水色)をまずは描画し、その次に前方へのパス数を表した棒グラフ(オレンジ)を、水色の棒グラフの高さをbottomに指定することで、積み上げ棒グラフを実現しています。

集合縦棒グラフを描画する

f:id:virgilvd:20190127115601p:plain

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(1,1,1)

ax.bar(df_lfc['Matchweek'], df_lfc['Liv Pass Backward'], width=0.25, color='turquoise', label='Liv Pass Backward')
ax.bar(df_lfc['Matchweek']+0.25, df_lfc['Liv Pass Forward'], width=0.25, color='salmon', label='Liv Pass Forward')

ax.set_xticks(df_lfc['Matchweek']+0.25/2)
ax.set_xticklabels(df_lfc['Opp Abbreviation'])

ax.set_ylabel('Pass Direction')

plt.legend()
plt.show()

続いてはこのような2つ以上の項目を比較する時に使用する横に並んだ縦棒グラフの描画方法についてです。

こちらは2つ目のグラフ(今回でいうとオレンジ)を、1つ目のグラフの幅の分だけズラして表示することで実現しています(4行目df_lfc['Matchweek']+0.25の部分)。これだけだとx軸のメモリの位置は1つ目のグラフの下にあるので、.set_xticks( )で2つのグラフの間に来るように調整しています。具体的には、棒グラフの幅の半分だけ右にずらすように指定します(5行目df_lfc['Matchweek']+0.25/2の部分)。

f:id:virgilvd:20190127121445p:plain

▲x軸のメモリを直さないとこんな感じに。若干左寄りなのが分かりますかね。

横棒グラフ/積み上げ横棒グラフ/集合横棒グラフ

f:id:virgilvd:20190113004611p:plain

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(1,1,1)

ax.barh(df_lfc['Matchweek'], df_lfc['Liv Pass Backward'], height=0.5, color='turquoise', label='Liv Pass Backward')
ax.barh(df_lfc['Matchweek'], df_lfc['Liv Pass Forward'], height=0.5, left=df_lfc['Liv Pass Backward'], color='salmon', label='Liv Pass Forward')

ax.set_yticks(df_lfc['Matchweek'])
ax.set_yticklabels(df_lfc['Opp Abbreviation'])

ax.set_xlabel('Pass Direction')

plt.legend()
plt.show()

最後に横棒グラフの描画方法についてです。縦棒グラフと大きく変わらないのでまとめて記載してしまいます。

横棒グラフを描画したい場合は、.barh( )を使用します。横向きになったことで、グラフの幅も横から縦へと変わるので、引数heightで指定することになります。同様の考え方で積み上げにしたい場合の引数も、bottomからleftへ変わります。軸の調整も当然.set_yticks( )を使うことになります。

以上、matoplotlibで色々な棒グラフを作成する方法でした。

戦術や分析に関して、こういう見方もあるよ、こうして見た方がいいよ、などご意見等ありましたら、コメントで教えていただけると幸いです。ぜひよろしくお願いいたします!