【Matplotlib】はじめてのグラフ描画!チュートリアル

グラフを初めて描画するにあたり,どのように始めればよいか不安を感じていることでしょう。グラフの構成や要素が理解できなくて、迷子になっていることもあります

この記事では,PythonのMatplotlibを使ったグラフ描画の基本を一から丁寧に解説します。グラフの構成や要素の理解に焦点を当てているため、初心者でも迷わずスタートできます。

読み終えた後、Matplotlibを活用してグラフを描画する基本的なスキルを身につけ、徐々に複雑なデータの可視化にも挑戦できるようになること間違いなしです。

目次

グラフを書く前に

Pythonでグラフを描画するにはライブラリが必要です

本記事ではMatplotlibという最も一般的なグラフ用のライブラリを使用します

インストール方法は一般のPython環境かAnaconda環境かで異なりますので詳しく解説します

一般的なPython環境

https://www.python.org/

Pythonをインストールする際に,下記のPython公式サイトから直接実施された場合は,一般的なPython環境です

この場合は最もピュアなPython環境ですので,コマンドプロンプトでMatplotlibをインストールします

pip install matplotlib

インストールが始まったらyesかnoを選択するところでyを入力して完了です。インストール後の確認は,pip listpip freezeのどちらかで確認できます

pip list

# matplotlib                    3.5.2
# matplotlib-inline             0.1.6

うまくいかない場合はPython環境の構築を下記の手順でやり直してください

Anaconda環境

https://www.anaconda.com/

下記サイトから実施された場合は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

うまくいかない場合はAnaconda環境の構築を下記の手順でやり直してください

シンプルなグラフ

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オブジェクト(AxesAxisの違いに注意)を含み,Axes内の目盛りと目盛りラベルを提供します。各Axesには,タイトル,xラベル,y ラベルもあります。

図の軸設定 (Axis)

図の軸に関するオブジェクトです。

スケールとリミットを設定し,目盛りと目盛りラベルを生成します。目盛りの位置はLocatorオブジェクトによって決定され,目盛りラベルの文字列はFormatterによってフォーマットされます。

図のすべて(Artist)

基本的に,Figure上に見えるものはすべてArtistです(FigureAxesAxisオブジェクトも)。

Figure が呼び出されると,すべてのArtistが描画されます。

https://matplotlib.org/stable/users/explain/quick_start.html

入力値の種類

基本的には配列なら入力できるため,listtupleを使用してOKです

グラフの入力として次のオブジェクトが想定されています。

  • numpy.array
  • numpy.ma.masked_array
  • numpy.asarray

pandasのデータやnumpy.matrixのようなarray-likeなクラスは,意図したように動作しないかもしれません。プロットする前にnumpy.arrayオブジェクトに変換してください。

コーディングスタイル

Matplotlibを使ってグラフを描画するには基本的に2つの方法があります

FigureとAxesのグラフ描画スタイル
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

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次