グラフを初めて描画するにあたり,どのように始めればよいか不安を感じていることでしょう。グラフの構成や要素が理解できなくて、迷子になっていることもあります
この記事では,PythonのMatplotlibを使ったグラフ描画の基本を一から丁寧に解説します。グラフの構成や要素の理解に焦点を当てているため、初心者でも迷わずスタートできます。
読み終えた後、Matplotlibを活用してグラフを描画する基本的なスキルを身につけ、徐々に複雑なデータの可視化にも挑戦できるようになること間違いなしです。
グラフを書く前に
Pythonでグラフを描画するにはライブラリが必要です
本記事ではMatplotlibという最も一般的なグラフ用のライブラリを使用します
インストール方法は一般のPython環境かAnaconda環境かで異なりますので詳しく解説します
一般的なPython環境
Pythonをインストールする際に,下記のPython公式サイトから直接実施された場合は,一般的なPython環境です
この場合は最もピュアなPython環境ですので,コマンドプロンプトでMatplotlibをインストールします
pip install matplotlib
インストールが始まったらyesかnoを選択するところでyを入力して完了です。インストール後の確認は,pip list
, pip freeze
のどちらかで確認できます
pip list
# matplotlib 3.5.2
# matplotlib-inline 0.1.6
Anaconda環境
下記サイトから実施された場合はAnaconda環境となります
忘れたという場合でも,PCにインストールされたアプリをanacondaで検索してください。いくつかのアプリがヒットするはずです。
Anaconda環境であればデフォルトでMatplotlibはインストールされています。Anaconda Promptを立ち上げて,conda list
で確認しましょう
conda list
# matplotlib 3.5.2 py39haa95532_0
# matplotlib-base 3.5.2 py39hd77b12b_0
# matplotlib-inline 0.1.6 py39haa95532_0
もしインストールされていなかった場合は,conda install
を使います
conda install -c conda-forge matplotlib
シンプルなグラフ
Matplotlibを使用して簡単な折れ線グラフを作成します
下記のタブにコードとフローチャートで説明しています
# step1 ライブラリを読み込む
import matplotlib.pyplot as plt
# step2 Axesを含むFigureを作成する
fig, ax = plt.subplots() # 1つのaxesを含むfigureを作成
# step3 Axesにデータを描画する
ax.plot([1, 2, 3, 4, 5], [1, 4, 2, 5, 7]) # axesにデータを描画
# step4 Figureを呼び出す
plt.show()
グラフの構成要素
Matplotlibの図の構成要素をまとめました
グラフの構成要素
- 全体の入れ物の図 (Figure)
-
図全体です。すべての子Axesやタイトル,図の凡例,カラーバーなどに対応します。
Axesと組み合わせて書くと便利ですが,Figureのみでもグラフを描画することができます
- データを描画する図 (Axes)
-
データのプロット領域を含むFigureにあるArtistです
通常は2つ(3Dの場合は3つ)の
Axis
オブジェクト(Axes
とAxis
の違いに注意)を含み,Axes内の目盛りと目盛りラベルを提供します。各Axesには,タイトル,xラベル,y ラベルもあります。 - 図の軸設定 (Axis)
-
図の軸に関するオブジェクトです。
スケールとリミットを設定し,目盛りと目盛りラベルを生成します。目盛りの位置は
Locator
オブジェクトによって決定され,目盛りラベルの文字列はFormatter
によってフォーマットされます。 - 図のすべて(Artist)
-
基本的に,Figure上に見えるものはすべてArtistです(
Figure
,Axes
,Axis
オブジェクトも)。Figure が呼び出されると,すべてのArtistが描画されます。
入力値の種類
基本的には配列なら入力できるため,list
やtuple
を使用してOKです
グラフの入力として次のオブジェクトが想定されています。
- numpy.array
- numpy.ma.masked_array
- numpy.asarray
コーディングスタイル
Matplotlibを使ってグラフを描画するには基本的に2つの方法があります
- Figure+Axes (OO-style)
-
FigureとAxesを作成し,それらを呼び出す
一般的なスタイルで,複雑なプロットや大きなプロジェクトにもお勧めします。
- Figureのみ (pyplot-style)
-
FigureとAxesを作成し,pyplot関数を使用してFigureのみ呼び出す
このpyplotスタイルは素早いインタラクティブな作業にはとても便利です。
Figure+Axes (OO-style)
明示的な”Axes”インターフェースは,FigureまたはAxesオブジェクトのメソッドを使用して他のArtistを作成し,段階的に視覚化を構築します。
これは “object-oriented”=OO-styleとも呼ばれています。
各オブジェクトは明示的に参照されるため非常に柔軟性があり,オブジェクトが作成された後,表示される前にカスタマイズすることができる。
一般的なスタイルで,複雑なプロットや大きなプロジェクトにもお勧めします。
# step1 ライブラリを読み込む
import matplotlib.pyplot as plt
import numpy as np
# step2 データの作成
x = np.arange(8)
apples = [5, 12, 8, 15, 20, 10, 18, 7]
oranges = [3, 14, 9, 17, 22, 11, 16, 6]
grapes = [8, 18, 12, 20, 25, 15, 23, 9]
# step3 グラフフレームの作成
fig, ax = plt.subplots(figsize=(6, 4))
# step4 グラフの描画
ax.plot(x, apples, label='apples')
ax.plot(x, oranges, label='oranges')
ax.plot(x, grapes, label='grapes')
# step5 軸ラベル,タイトル,凡例の設定
ax.set_xlabel('X label') # Xラベル
ax.set_ylabel('Y label') # Yラベル
ax.set_title('Figure+Axes OO-style') # タイトル
ax.legend() # 凡例
# step6 グラフの呼び出し
plt.show()
Figureのみ (pyplot-style)
暗黙的な “pyplot “インターフェースは,最後に作成されたFigureとAxesを追跡し,ユーザーが望んでいるオブジェクトにArtistを追加します。
コードはシンプルで理解しやすく,素早くグラフを描画できます
ただし,常に最後のFigureを追跡するため柔軟性が低く,複数のFigureが存在する場合,Figureを呼びなおしてArtistを追加しなければなりません
# step1 ライブラリを読み込む
import matplotlib.pyplot as plt
import numpy as np
# step2 データの作成
x = np.arange(8)
apples = [5, 12, 8, 15, 20, 10, 18, 7]
oranges = [3, 14, 9, 17, 22, 11, 16, 6]
grapes = [8, 18, 12, 20, 25, 15, 23, 9]
# step3 グラフフレームの作成
plt.figure(figsize=(6, 4))
# step4 グラフの描画
plt.plot(x, apples, label='apples')
plt.plot(x, oranges, label='oranges')
plt.plot(x, grapes, label='grapes')
# step5 軸ラベル,タイトル,凡例の設定
plt.xlabel('X label') # Xラベル
plt.ylabel('Y label') # Yラベル
plt.title('Only Figure pyplot-style') # タイトル
plt.legend() # 凡例
# step6 グラフの呼び出し
plt.show()
グラフのスタイリング
スタイリングは,①Axes.plotで呼び出したとき,②Artistの”setter”で後から追加する手法があります。①がおすすめで,②は変数に置き換える必要があります
色,線の太さ,線の種類の3つのスタイリングを実施します
コードはOO-styleを使用しました
# step3 グラフの描画
# 1 Axes.plotで呼び出したとき
ax.plot(x, apples, label='apples', color='red', linewidth=3, linestyle='--')
# 2 Artistの"setter"で後から追加
o, = ax.plot(x, oranges, label='oranges', color='#F44336')
o.set_linewidth(2)
o.set_linestyle('-.')
複数のFiguresとAxes
行列方式で1つのウィンドウ内に複数のグラフを配置することができます
plt.subplots(行, 列)のようにカッコ内に行,列の順序で個数を指定してください
各Axesの呼び出しの際には,リストと同様にaxs[0]
やaxs[1]
とします
# step2 グラフフレームの作成
fig, axs = plt.subplots(2, 1, figsize=(6, 4))
# step3 グラフの描画
axs[0].plot(x, apples, label='apples', color='r')
axs[1].plot(x, oranges, label='oranges', color='C1')
# step4 軸ラベル,タイトル,凡例の設定
axs[0].set_xlabel('X label') # Xラベル
axs[0].set_ylabel('Y label') # Yラベル
axs[0].legend() # 凡例
fig.suptitle('Multiple Figures and Axes')
軸の対数スケールと目盛り,刻み幅の設定
各AxesにはX軸とY軸を表す2つのAxisオブジェクトがあります。これらは軸のスケール,目盛り位置,目盛りスタイルを制御します。
目盛りの上限下限,目盛りの刻み幅,対数スケールを設定しました
コードの記述方法は軸ラベルやタイトルと同様です
# step0 ライブラリのインストール
import matplotlib.pyplot as plt
import numpy as np
# step1 データの作成
x = np.linspace(0, 10, 100)
y1 = np.exp(x) + 2 * np.sin(2 * x)
y2 = np.exp(x) + 2 * np.cos(2 * x)
# step2 グラフフレームの作成
fig, axs = plt.subplots(1, 2, sharex=True)
# step3 グラフの描画
for ax in axs.flat:
ax.plot(x, y1, label='Sample 1')
ax.plot(x, y2, label='Sample 2')
ax.legend()
# step4 軸ラベル,タイトルの設定
axs[0].set_title('linear')
axs[1].set_title('log')
fig.suptitle('scale')
fig.supxlabel('X label')
fig.supylabel('Y label')
# step5 対数スケールと目盛り,刻み幅の設定
axs[0].set_xlim(0, 10)
axs[0].set_ylim(0)
axs[0].set_yticks([0, 6000, 12000, 18000, 24000])
axs[1].set_yscale('log')
# step6 グラフの呼び出し
plt.show()
参考文献
Quick start guide
コメント