Python Matplotlib¶
はじめに¶
Pythonでグラフをプロットするライブラリの定番です。MATLABのグラフプロットに近い使い勝手を提供する pyplot API と、オブジェクト指向APIと2つのAPI体系が用意されています。
準備¶
インストール¶
pip install matplotlib
でインストールします。
日本語化させる¶
matplotlibは日本語対応していないので、グラフの軸名などに日本語が設定できません。日本語を使えるようにするライブラリを追加で取り込みます。
matplotlib_fontja¶
python 3.12以降にも利用できる matplotlibの日本語対応ライブラリです。pipでインストール可能です。
https://github.com/ciffelia/matplotlib-fontja
japanize_matplotlibライブラリのインストール¶
書籍、ブログ等ではまずこれが出てくるほどメジャーですが、2025年6月時点の最新バージョン 1.1.3(2020年10月リリース)では、Python 3.12以降でエラーとなってしまいます。Python 3.12においてdistutilsライブラリが標準から除外されたため、japanize_matplotlibの中で使用しているdistutilsが名前未解決になるためです。
プログラミングメモ¶
ライブラリのインポート¶
import matplotlib.pyplot as plt
pyplotモジュールをインポートします。慣例で、名前をpltで参照しています。
APIのアプローチ2種類¶
matplot API¶
パッケージに定義される関数を逐次呼び出してグラフを描かせます。
基本的なグラフのプロットが可能ですが、細かく設定するには次のオブジェクト指向APIを使用します。
オブジェクト指向API¶
グラフの描画領域、個別のグラフなどを細かく設定してグラフをプロットします。
グラフの配置、図の大きさ¶
描画したグラフの画像サイズ¶
matplotlibは、プロットしたグラフを画像として生成します。その画像サイズを指定するには、次のように
fig = plt.figure(figsize=(16, 4.5))
ここで、figsizeパラメータに指定するのは画像サイズの幅、高さのタプルで単位はインチになります。インチと画素数の対応はデフォルトでは100dpiです。このfigure関数の実行は省略可能で、その時はデフォルトの画像サイズとなります。
複数のグラフを配置するときのグラフ間の余白¶
1つの画像に複数のグラフを並べるときの、グラフとグラフの縦・横の間隔を設定します。
fig.subplots_adjust(hspace=0.4, wspace=0.2)
水平方向の間隔をwspaceパラメータで、垂直方向の間隔をhspaceパラメータで指定します。どうやらwはwidth、hはheightの略のようです。
図にグラフを追加¶
ax1 = fig.add_subplot(131)
ax2 = fig.add_subplot(132)
figureに対してadd_subplotでグラフ領域を追加します。引数は、1桁の数字を3つつなげて3桁の整数を渡します。1桁目が縦方向の分割数(1は分割なし)、2桁目が横方向の分割数(1は分割なし)、3桁目は左上から何番目のグラフ領域かを指定します。その位置のグラフのAxesオブジェクトが返されます。
この例では縦は1行、横は3列にグラフ領域を配置し、左から1番目、2番目のグラフ領域のAxesを取得しています。
ラベル¶
タイトル¶
グラフの上部中央に表示する題名になるラベルです。
matplot API¶
グラフは一つなので、グラフ上部のタイトルを 別名pltモジュールの関数で設定します。
plt.title('memory plot')
オブジェクト指向API¶
図の中に複数のグラフを配置できるので、個々のグラフ(Axes)にタイトルを設定します。
ax3.set_title('cpu load')
軸ラベル¶
matplot API¶
plt.xlabel('time')
plt.ylabel('memory[KiB]')
オブジェクト指向API¶
ax2.set_xlabel('time')
ax2.set_ylabel('load')
グリッド表示¶
目盛の線の表示¶
matplot API¶
plt.grid()
![]() |
![]() |
軸線(Major)を表示 plt.grid() |
軸線(MajorとMinor)を表示、Minorは破線を指定。コード例は後述 |
plt.minorticks_on()
plt.grid(which="major")
plt.grid(which="minor", linestyle=":")
オブジェクト指向API¶
書式Axes.grid(b=None, which="major", axis="both", **kwargs)
- bには、True | False | None のいずれかを指定。True:グリッド表示、False:グリッド非表示、None:現在の状態を反転
- whichには、major | minor | both のいずれかを指定。major:majorメモリに線を引く、minorメモリに線を引く、both:両方に線を引く
- axisには、x | y | both のいずれかを指定。x:X軸の値に線を引く(縦線)、y:Y軸の値に線を引く(横線)、both:両方に線を引く
日時¶
時系列データで、軸の表示を日時にする場合、文字列ではなく datetime型で渡す必要があります。
日時の軸の表示設定¶
日時は文字数が多いので、デフォルトの軸の値の表示は重なり合ってしまうので、軸の値の表示を回転させる等のテクニックが必要になります。
![]() |
デフォルトの表示 |
![]() |
30度回転 plt.xticks(rotation=30) |
![]() |
30度回転と書式をHH:MMに指定 |
- 日時の軸の表現形式を変更
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
:
plt.xticks(rotation=30)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter("%H:%M"))
複数のグラフを1枚の画像にプロット¶
subplotを使って、複数のグラフを1つの画像にプロットします。グラフの縦・横・プロット対象インデックスを指定すると、そのグラフにプロットされます。
縦に2つ、横に3つのグラフを一つの画像にプロットし、その4つ目(2行目1桁目)にプロット開始するplt.subplot(2, 3, 4)
画像全体のラベルは、plt.suptitle('Whole Title')
一つのグラフに複数のプロット¶
2つのプロットを実行します。
plt.plot(xarray, y1array, color='black', label='cpu') # 1つ目のプロット、黒色で、凡例を'cpu'
plt.plot(xarray, y2array, color='blue', label='memory') # 2つ目のプロット、青色で、凡例を'memory'
plt.legend(loc='upper right') # 凡例を、右上に表示
同じグラフに複数のデータ系列を重ねて表示するので、色を分けると便利です。plot()関数の引数 color で色をそれぞれ指定しています。
次に凡例を表示するため、plot()関数の引数 label で名前を指定し、legend()関数の引数 loc で凡例の表示位置を指定します。