MatplotlibによるPythonデータビジュアライゼーション

データの傾向を可視化することは、データサイエンスと機械学習における最も重要なタスクの1つである。

データマイニングや機械学習のアルゴリズムの選択は、データ可視化の段階でデータセットに識別されるパターンに大きく依存します。

この記事では、Pythonでどのように異なる種類のデータ可視化を行うことができるかを見ていきます。

Pythonのデータ可視化のデファクトスタンダードであるPythonのMatplotlibライブラリーを使用することにします。

A Brief Introduction to Matplotlib for Data Visualizationという記事では、Matplotライブラリの非常にハイレベルな紹介と、散布図、棒グラフ、ヒストグラムなどの描き方について説明しています。

この記事では、より多くの Matplotlib の機能性を探ります。

デフォルトのプロットサイズを変更する

最初に行うことは、デフォルトのプロットサイズを変更することです。

デフォルトでは、Matplotlib のプロットのサイズは、6 x 4 インチです。

プロットのデフォルトサイズは、このコマンドで確認することができます。

import matplotlib.pyplot as plt


print(plt.rcParams.get('figure.figsize'))


より見やすくするために、Matplotlibのグラフのデフォルトサイズを変更する必要があるかもしれません。

そのためには、以下のスクリプトを使用します。

fig_size = plt.rcParams["figure.figsize"]
fig_size[0] = 10
fig_size[1] = 8
plt.rcParams["figure.figsize"] = fig_size


上記のスクリプトは、Matplotlibのプロットのデフォルトサイズを10 x 8インチに変更します。

簡単な折れ線グラフから話を始めましょう。

ラインプロット

線描画は、Matplotlib で最も基本的な描画です。

あらゆる関数をプロットするために使用することができます。

ここでは、cube 関数に対して線グラフをプロットしてみましょう。

次のスクリプトを見てください。

import matplotlib.pyplot as plt
import numpy as np


x = np.linspace(-10, 9, 20)


y = x ** 3


plt.plot(x, y, 'b')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Cube Function')
plt.show()


上のスクリプトでは、まず Matplotlib ライブラリから pyplot クラスをインポートしています。

このスクリプトでは、2つの numpy 配列 xy を用意しています。

numpyライブラリのlinspaceメソッドを使用して、-10 から正の 9 までの 20 個の数値のリストを作成します。

そして、すべての数値の立方根をとり、その結果を変数yに代入しました。

2 つのnumpy配列をプロットするには、Matplotlib ライブラリのpyplotクラスのplotメソッドに渡すだけです。

xlabel, ylabel, title 属性を使って、x軸、y軸、タイトルをラベル付けすることができます。

上のスクリプトの出力はこのようになります。

出力です。

複数のプロットを作成する

Matplotlib を使って、1 つのキャンバスに複数のプロットを作成することができます。

これを行うには、場所とプロット番号を指定する subplot 関数を使用しなければなりません。

次の例を見てください。

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 9, 20)


y = x ** 3


plt.subplot(2,2,1)
plt.plot(x, y, 'b*-')
plt.subplot(2,2,2)
plt.plot(x, y, 'y--')
plt.subplot(2,2,3)
plt.plot(x, y, 'b*-')
plt.subplot(2,2,4)
plt.plot(x, y, 'y--')


subplot` 関数の最初の属性は、サブプロットが持つ行数で、2番目のパラメータ種はサブプロットの列数です。

2,2という値は、4つのグラフが存在することを意味します。

第3引数はグラフが表示される位置である。

位置は左上から始まります。

位置が1のグラフは、最初の行と最初の列に表示されます。

同様に、位置が2のグラフは、1行目と2列目に表示されます。

plot` 関数の3番目の引数を見てみましょう。

この引数は、グラフ上のマーカーの形と色を定義します。

出力してみましょう。

オブジェクト指向でプロットする

前のセクションでは、pyplot クラスの plot メソッドを使用して、ラベルと一緒に x と y 座標の値を渡しました。

しかし、Pythonでは同じプロットをオブジェクト指向で描画することができます。

次のスクリプトを見てください。

import matplotlib.pyplot as plt
import numpy as np


x = np.linspace(-10, 9, 20)


y = x ** 3


figure = plt.figure()


axes = figure.add_axes([0.2, 0.2, 0.8, 0.8])


pyplotクラスを使ってfigureメソッドを呼び出すと、figureオブジェクトが返されます。

このオブジェクトを使用してadd_axesメソッドを呼び出すことができます。

add_axes メソッドに渡されるパラメータは、デフォルトの軸の左と下からの距離と、軸の幅と高さです。

これらのパラメータの値は、デフォルトの図のサイズに対する割合で記載する必要があります。

上のスクリプトを実行すると、次の図のような空の軸が作成されます。

上のスクリプトの出力は次のようになります。

軸ができたので、この軸にデータとラベルを追加することができます。

データを追加するには、plot関数を呼び出してデータを渡す必要があります。

同様に、X 軸、Y 軸、タイトルのラベルを作成するには、以下のように set_xlabelset_ylabelset_title 関数を使用します。

import matplotlib.pyplot as plt
import numpy as np


x = np.linspace(-10, 9, 20)


y = x ** 3


figure = plt.figure()


axes = figure.add_axes([0.2, 0.2, 0.8, 0.8])


axes.plot(x, y, 'b')
axes.set_xlabel('X Axis')
axes.set_ylabel('Y Axis')
axes.set_title('Cube function')


出力は最後のセクションで得たものと似ていますが、今回はオブジェクト指向のアプローチを使用していることがわかります。

add_axes` メソッドを使えば、1つのプロットに好きなだけ軸を追加することができます。

次の例を見てください。

import matplotlib.pyplot as plt
import numpy as np


x = np.linspace(-10, 9, 20)


y = x ** 3


z = x ** 2


figure = plt.figure()


axes = figure.add_axes([0.0, 0.0, 0.9, 0.9])
axes2 = figure.add_axes([0.07, 0.55, 0.35, 0.3]) # inset axes


axes.plot(x, y, 'b')
axes.set_xlabel('X Axis')
axes.set_ylabel('Y Axis')
axes.set_title('Cube function')


axes2.plot(x, z, 'r')
axes2.set_xlabel('X Axis')
axes2.set_ylabel('Y Axis')
axes2.set_title('Square function')


上のスクリプトをよく見てください。

上のスクリプトでは、2つの軸があります。

最初の軸は入力の立方根のグラフを含み、2番目の軸は同じデータの平方根のグラフを立方根軸のもう一方のグラフの中に描きます。

この例では、left、bottom、width、height のパラメータの役割をより良く理解することができます。

最初の軸では、left と bottom の値をゼロに設定し、width と height の値を 0.9 に設定します。

これは、外側の軸の幅と高さが既定の軸の 90% になることを意味します。

2番目の軸では、leftの値を0.07、bottomの値を0.55に設定し、widthとheightはそれぞれ0.35と0.3である。

上のスクリプトを実行すると、立方体関数の大きなグラフと、立方体関数のグラフの内側にある平方関数の小さなグラフが表示されます。

出力は次のようになる。

サブプロット

一度に複数のプロットを作成するもう一つの方法は、 subplot メソッドを使用することです。

パラメータ nrowncols に値を渡す必要があります。

生成されるプロットの総数は nrow x ncols となります。

それでは、簡単な例を見てみましょう。

以下のスクリプトを実行してください。

import matplotlib.pyplot as plt
import numpy as np


x = np.linspace(-10, 9, 20)


y = x ** 3


z = x ** 2


fig, axes = plt.subplots(nrows=2, ncols=3)


出力には、以下のように2行3列の6つのプロットが表示されます。

次に、ループを使って、これらのグラフに二乗関数の出力を加える。

次のスクリプトを見よ。

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 9, 20)


z = x ** 2


figure, axes = plt.subplots(nrows=2, ncols=3)


for rows in axes:
    for ax1 in rows:
        ax1.plot(x, z, 'b')
        ax1.set_xlabel('X - axis')
        ax1.set_ylabel('Y - axis')
        ax1.set_title('Square Function')


上のスクリプトでは、subplots関数が返す軸を繰り返し、各軸に2乗関数の出力を表示しています。

2行3列の軸があるので、すべての軸を反復するためにネストされたループを実行しなければならないことに注意してください。

外側のforループは行の軸を反復し、内側のforループは列の軸を反復します。

上のスクリプトの出力は次のようになります。

出力では、6つのプロットすべてに2乗関数があることがわかります。

プロットの図形の大きさを変更する

デフォルトのグラフサイズを変更するだけでなく、特定のグラフの図形サイズを変更することもできます。

これを行うには、 subplots 関数の figsize パラメータに値を渡す必要があります。

figsize` パラメータの値はタプルの形で渡す必要があり、最初の値がグラフの幅に、2番目の値が高さに対応します。

次の例で、特定のプロットのサイズを変更する方法をご覧ください。

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 9, 20)


y = x ** 3


z = x ** 2


figure, axes = plt.subplots(figsize = (6,8))


axes.plot(x, z, 'r')
axes.set_xlabel('X-Axis')
axes.set_ylabel('Y-Axis')
axes.set_title('Square Function')


上のスクリプトでは、2乗関数のプロットを幅6インチ、高さ8インチで描画しています。

出力はこのようになります。

レジェンドの追加

Matplotlib ライブラリを使えば、プロットに凡例を追加するのは非常に簡単です。

必要なことは、 plot 関数の label パラメータに値を渡すだけです。

そして、 plot 関数を呼び出した後に、 legend 関数を呼び出せばよいのです。

次の例を見てください。

import matplotlib.pyplot as plt
import numpy as np


x = np.linspace(-10, 9, 20)


y = x ** 3


z = x ** 2


figure = plt.figure()


axes = figure.add_axes([0,0,1,1])


axes.plot(x, z, label="Square Function")
axes.plot(x, y, label="Cube Function")
axes.legend()


上のスクリプトでは、x, y, z 変数を用いて square と cube という2つの関数を定義しています。

次に、まず square 関数をプロットし、label パラメータに Square Function という値を渡します。

これは、square 関数のラベルに表示される値になります。

次に、三次関数をプロットし、label パラメータに Cube Function という値を渡します。

出力はこのようになります。

出力では、左上隅に凡例が表示されているのがわかります。

凡例の位置は、legend 関数の loc パラメータに値を渡すことで変更することができます。

指定できる値は、1 (右上コーナー)、2 (左上コーナー)、3 (左下コーナー)、4 (右下コーナー)です。

プロットの右下隅に凡例を描いてみましょう。

次のスクリプトを実行する。

import matplotlib.pyplot as plt
import numpy as np


x = np.linspace(-10, 9, 20)


y = x ** 3


z = x ** 2


figure = plt.figure()


axes = figure.add_axes([0,0,1,1])


axes.plot(x, z, label="Square Function")
axes.plot(x, y, label="Cube Function")
axes.legend(loc=4)


出力

カラーバリエーション

プロットの色とスタイルを変更するために、いくつかのオプションがある。

最も簡単な方法は、次のスクリプトに示すように、色の最初の文字を第3引数として渡すことである。

import matplotlib.pyplot as plt
import numpy as np


x = np.linspace(-10, 9, 20)


y = x ** 3


z = x ** 2


figure = plt.figure()


axes = figure.add_axes([0,0,1,1])


axes.plot(x, z, "r" ,label="Square Function")
axes.plot(x, y, "g", label="Cube Function")
axes.legend(loc=4)


上のスクリプトでは、最初のプロットの第3引数として文字列 “r” が渡されています。

2番目のプロットでは、文字列 “g “が3番目の引数として渡されています。

出力では、最初のプロットは赤の実線で、2番目のプロットは緑の実線で、次のように印刷されます。

プロットの色を変更するもう一つの方法は、 color パラメータを利用することです。

色の名前または色の16進数値を color パラメータに渡すことができます。

次の例を見てください。

import matplotlib.pyplot as plt
import numpy as np


x = np.linspace(-10, 9, 20)


y = x ** 3


z = x ** 2


figure = plt.figure()


axes = figure.add_axes([0,0,1,1])


axes.plot(x, z, color = "purple" ,label="Square Function")
axes.plot(x, y, color = "#FF0000", label="Cube Function")
axes.legend(loc=4)


出力します。

出力:

スタックプロット

スタックプロットは棒グラフや折れ線グラフの拡張で、異なるカテゴリのデータを分解し、それらを積み重ねて、異なるカテゴリの値間の比較を簡単にできるようにしたものです。

例えば、過去 8 年間に 3 人の異なるサッカー選手によって得点された年間ゴールを比較したい場合、以下のスクリプトを使用して Matplot でスタックプロットを作成することができます。

import matplotlib.pyplot as plt


year = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018]


player1 = [8,10,17,15,23,18,24,29]
player2 = [10,14,19,16,25,20,26,32]
player3 = [12,17,21,19,26,22,28,35]


plt.plot([],[], color='y', label = 'player1')
plt.plot([],[], color='r', label = 'player2')
plt.plot([],[], color='b', label = 'player3 ')


plt.stackplot(year, player1, player2, player3, colors = ['y','r','b'])
plt.legend()
plt.title('Goals by three players')
plt.xlabel('year')
plt.ylabel('Goals')
plt.show()


出力

Python を使って積み上げプロットを作成するには、Matplotlib ライブラリの stackplot クラスを単純に使用することができます。

表示したい値はクラスの最初のパラメータとして渡され、横軸に積み重ねる値は2番目のパラメータ、3番目のパラメータ…と表示されます。

また、colors属性で各カテゴリーの色を設定することができます。

円グラフ

円グラフは、異なるカテゴリーが円の一部としてマークされている円形のグラフである。

カテゴリが大きければ大きいほど、グラフ上で占める割合が大きくなる。

あるサッカーチームがフリーキック、ペナルティ、フィールドゴールから得たゴールについて、簡単な円グラフを描いてみよう。

次のスクリプトを見てください。

import matplotlib.pyplot as plt


goal_types = 'Penalties', 'Field Goals', 'Free Kicks'


goals = [12,38,7]
colors = ['y','r','b']


plt.pie(goals, labels = goal_types, colors=colors ,shadow = True, explode = (0.05, 0.05, 0.05), autopct = '%1.1f%%')
plt.axis('equal')


plt.show()


出力

Matplot lib で円グラフを作成するためには、 pie クラスを用います。

クラスコンストラクタの最初のパラメータは、各カテゴリの数値のリストです。

カンマで区切られたカテゴリのリストは、 labels 属性の引数として渡されます。

各カテゴリーの色のリストは colors 属性に渡されます。

true に設定すると、 shadow 属性が円グラフ上の異なるカテゴリの周囲に影を作成します。

最後に、 explode 属性は円グラフを個々のパーツに分割します。

ここで重要なのは、各カテゴリのパーセンテージを渡す必要はなく、値を渡すだけで円グラフのパーセンテージが自動的に計算されることです。

グラフの保存

Matplotlib では、グラフの保存が非常に簡単です。

figure オブジェクトから savefig メソッドを呼び出し、グラフを保存するファイルのパスを渡せばよいのです。

次の例を見てください。

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 9, 20)


y = x ** 3


z = x ** 2


figure, axes = plt.subplots(figsize = (6,8))


axes.plot(x, z, 'r')
axes.set_xlabel('X-Axis')
axes.set_ylabel('Y-Axis')
axes.set_title('Square Function')


figure.savefig(r'E:/fig1.jpg')


上記のスクリプトは、E ディレクトリのルートに fig1.jpg という名前でファイルを保存します。

もし、あなたがデータ可視化に興味があり、何から始めたらよいかわからない場合は、Pythonによるデータ可視化に関する本をぜひご覧ください。

Pythonの初級者から中級者向けの本であるData Visualization in Pythonは、Pandasを使った簡単なデータ操作から、MatplotlibやSeabornなどのコアプロットライブラリ、そしてAltairなどの宣言的・実験的ライブラリを活用する方法までを解説しています。

Pythonによるデータ可視化

ビジュアライゼーションでデータをより良く理解しましょう! この本では、Matplotlib、Seaborn、Bokehなどの人気ライブラリを使って、Pythonでデータを可視化するためのノウハウを275ページ以上にわたって学びます。

結論

Matplotlib は、データの可視化やプロットのために最もよく使われる Python ライブラリの1つです。

この記事では、最も頻繁に使用される Matplotlib 関数のいくつかを、さまざまな例の助けを借りて説明しました。

この記事は基本的なことをほとんどカバーしていますが、これは氷山の一角にすぎません。

Matplotlib ライブラリの公式ドキュメントを読んで、この素晴らしいライブラリで何ができるのか見てみることをお勧めします。

タイトルとURLをコピーしました