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

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

【Python】matplotlibでの可視化をもう少し詳しく見てみる

今回は、前回さくっと飛ばしてしまったグラフの描画について、もう少し深く理解していきたいと思います。

 

matplotlibの概略

前回matplotlibを使用してヒストグラムを描画しましたが、正直なところコードの意味は全く理解できませんでした。それではいけないと思い、色々調べてなんとなく理解したところまでをまとめておきたいと思います。(オブジェクト指向を理解できていないため、概念的な理解に留まっていると思います。)

・Figure、Axes、Axisについて

調べてわかったのですが、どうやらmatplotlibにはFigure・Axes・Axisという概念があるそうです。日本語の意味はそれぞれ、形?・軸(複数)・軸となります。日本語訳からもなんとなく分かりますが、Figureは描画する領域全体を、Axesは1つのグラフを、Axisはグラフの中の1つの軸を表しています。それぞれ入れ子の関係になっているとのことです。

f:id:virgilvd:20181112213144p:plain

▲出典:Usage — Matplotlib 1.5.1 documentation

・matplotlibを使用する際の流れ

まずは土台となるFigureの領域とグラフ領域であるAxes(add_subplot)を定義します。それが出来たら実際にグラフを描画し、Axis領域の設定(ラベルの名前など)をしていきます。最後にplt.show( )することで、これまでに設定してきた内容を一気に表示させることが出来ます。

・よく使いそうなメソッド

下記に簡潔にまとまっていたので、そのまま参考にさせてもらいます。

qiita.com

 

前回使用したコードを読み解く

import matplotlib.pyplot as plt
%matplotlib inline
fig = plt.figure(figsize=(10, 6)) ax = fig.add_subplot(111) freq, _, _ = ax.hist(height, bins=12, range=(150, 210)) ax.set_xlabel('height') ax.set_ylabel('count') ax.set_xticks(np.linspace(150, 210, 12+1)) ax.set_yticks(np.arange(0, freq.max()+10, 10)) plt.show()

f:id:virgilvd:20181106234551p:plain

前回可視化した際に使用したコードとそのアウトプットが上記になります。(heightにはプレミアリーグ所属選手の身長が、NumPyのarray形式で格納されています。)おさらいになりますが、コードの2行目はグラフをGoogle Clab(Jypter Notebooks)上で表示させるのに必要となります。

3行目と4行目はそれぞれ、FigureとAxesを定義しています。plt.figureは因数がなくても機能しますが、figsizeで指定することでサイズを変えることができます。add.sub_plotはFiguerに対してグラフの領域を作成します。因数の(111)は、1列×1行の行列の1番目の要素部分に作成することを指定しています。

f:id:virgilvd:20181112222117p:plain
f:id:virgilvd:20181112222137p:plain

▲plt.figure( )でfigsizeを(1,1)と(5,5)にした時の違い

 

freq, _, _ = ax.hist(height, bins=12, range=(150, 210))

5行目でAxesに対してヒストグラムを描画しています。引数のbinsが階級数を、rangeが最小値と最大値を指定しています。 

今まで「freq, _ , _ =  〜」などの「 , _ (カンマ アンスコ)」部分の意味が分かっていなかったのですが、どうやらこれは複数の戻り値を返すメソッド等で、以降では使わない値を格納する変数を、分かりやすいように「 _ (アンスコ)」で明示的に示しているそうです。Axes.hist( )では、変数を3つ指定することで、戻り値として「度数の配列」「階級数+1の階級を表す配列」「パッチ?(よく分かりませんでした。。)」の3つ返すようです。今回は「度数の配列」が必要だったため、他の変数をアンスコで表していたということになります。

f:id:virgilvd:20181112224624p:plain

▲変数を指定すると実際はこういった値が格納されます。 

6行目と7行目は、set_xlabelとset_ylabelでそれぞれx軸とy軸にラベル名をつけています。

8行目と9行目では、軸のメモリを定めています。set_xticks(set_yticks)は、渡された配列を元がそのままメモリになるのですが、今回の例では指定した区間(150から210)をN等分(12)した配列を作るnp.linespace( )と、等差数列(0からfreqの最大+10まで、等差10)の配列を作るnp.arrange( )を使って実現しています。

最後に、ここまでの内容をplt.show( )で実際に描画して完成となります。今回はこれで終了です。

 

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