JavaScriptを有効にしてください

Matplotlibでオブジェクト指向なグラフの調整

 ·   6 min read

はじめに

matplotlibライブラリで作成したグラフをオブジェクト指向スタイルで調整する。
matplotlibの基本的なオブジェクトとグラフ作成については前の記事を参照。

環境

ソフトウェア バージョン
spyder 3.2.3
python 3.6.2
matplotlib 2.0.2

本ページでは、matplotlibライブラリとpyplotモジュールを以下のようにインポートしていることを前提とする。

1
2
import matplotlib as mpl
import matplotlib.pyplot as plt

グラフのタイトル

グラフ(axesオブジェクト)の上部にタイトルを付ける。

1
Axes.set_title(label, loc="center", fontdict, **kwargs)

引数の型と意味を以下に示す。

label: str型
グラフのタイトル。"\n"で改行可能。

loc: str型、optional
タイトルの位置を制御する。
{“center”, “right”, “left”}のいずれかを指定可能。

fontdict: dict型、optional
文字の大きさ、太さ、縦揃い位置、横揃い位置を制御する。
デフォルトの設定は以下の通り。

1
2
3
4
{"fontsize":            rcParams["axes.titlesize"],
 "fontweight":          rcParams["axes.titleweight"],
 "verticalalignment":   "baseline",
 "horizontalalignment": loc}

rcParamsは、matplotlibデフォルトのパラメータであり、以下を実行することで確認できる。

1
2
mpl.rcParams["axes.titlesize"]
mpl.rcParams["axes.titleweight"]

fontsizeは文字の大きさであり、数値で指定できる。
または、str型として以下のいずれかから指定可能。
{“xx-small”, “x-small”, “small”. “medium”, “large”, “x-large”, “xx-large”}

fontweightは文字の太さであり、0~1000までの数値で指定できる。
または、str型として以下のいずれかから指定可能。
{“ultralight”, “light”, “normal”, “regular”, “book”, “medium”, “roman”, “semibold”, “demibold”, “demi”, “bold”, “heavy”, “extra bold”, “black”}

horizontalalignmentは文字の横揃い位置であり、以下のいずれかから指定可能。
{“center”, “right”, “left”}
指定しなければ、locと同じ値になる。

kwargs: optional
Textクラスで指定できるパラメータ。
詳細は以下のページを参照。

matplotlib.text — Matplotlib 3.3.3 documentation

例:

1
2
3
4
5
6
7
fig, ax = plt.subplots()
ax.plot([1,2], [3,4])
ax.set_title("Figure's \n title", 
             loc="left",
             fontdict={"fontsize":   18,
                       "fontweight": "bold"})
plt.show()

実行結果:
title

参考:
matplotlib.axes.Axes.set_title — Matplotlib 3.3.3 documentation

軸のラベル

x, y軸にラベルを付けるとき、それぞれset_xlabel, set_ylabelメソッドを使う。

1
2
Axes.set_xlabel(xlabel, labelpad=None, fontdict, **kwargs)
Axes.set_ylabel(ylabel, labelpad=None, fontdict, **kwargs)

引数の型と意味を以下に示す。

xlabel, ylabel: str型
軸のラベル。"\n"で改行可能。

fontdict: dict型、optional
文字の大きさ、太さ、縦揃い位置、横揃い位置を制御する。
詳細はset_titleの項を参照。

labelpad: 数値、optional
ラベルと軸の間のスペース。負の数も可。

kwargs: optional
Textクラスで指定できるパラメータ。

参考:
matplotlib.axes.Axes.set_xlabel — Matplotlib 3.3.3 documentation

軸の範囲

軸の範囲を制限するときは、Axesオブジェクトのset_xlim, set_ylimメソッドを使う。

1
2
Axes.set_xlim(left=None, right=None)
Axes.set_ylim(bottom=None, top=None)

引数の型と意味を下表に示す。

引数 意味
left スカラ x軸の左側
right スカラ x軸の右側
bottom スカラ y軸の下側
top スカラ y軸の上側

set_xlim, set_ylimに2つの引数をキーワードを指定せずに渡すと、順にleft, rightに代入される。
軸の範囲を片側だけ制限したい場合は、制限したい側のみに引数を渡す。制限しなかった側は、自動で調整される。

また、set_xlimの引数の値をleft>right (set_ylimの場合はbottom>top) とすると、軸の正負が反転する。なお、軸の反転は以下のメソッドでも行える。

1
2
Axes.invert_xaxis()
Axes.invert_yaxis()

例: x軸の最大範囲を3として、y軸を反転させる。

1
2
3
4
5
fig, ax = plt.subplots()
ax.plot([1,5], [3,4])
ax.set_xlim(right=3)
ax.set_ylim(5, 2)
plt.show()

以下のinvert_yaxisメソッドを使ったスクリプトも同じ結果となる。

1
2
3
4
5
6
fig, ax = plt.subplots()
ax.plot([1,5], [3,4])
ax.set_xlim(right=3)
ax.set_ylim(2, 5)
ax.invert_yaxis()
plt.show()

実行結果:
set_lim

参考:
matplotlib.axes.Axes.set_xlim — Matplotlib 3.3.3 documentation
matplotlib.axes.Axes.set_ylim — Matplotlib 3.3.3 documentation

凡例の表示

グラフに凡例(legend)を付ける。

1
Axes.legend(*args, **kwargs)

凡例をlegendの引数として、リスト形式で指定可能。

例1:

1
2
3
4
5
fig, ax = plt.subplots()
ax.plot([1,2], [3,4])
ax.plot([1,2], [4,3])
ax.legend(["Line 1", "Line 2"])
plt.show()

実行結果1:
legend

なお、以下のようにラベルが既に設定されている場合は、legendメソッドの引数は不要である。

例2:

1
2
3
4
5
fig, ax = plt.subplots()
ax.plot([1,2], [3,4], label="Line 1")
ax.plot([1,2], [4,3], label="Line 2")
ax.legend()
plt.show()

実行結果2:
実行結果1と同じ。

その他の主な引数の型と意味を以下に示す。

loc: str型、optional

凡例の位置を以下のいずれかから指定可能。デフォルト値は best (プロットと凡例がなるべく重ならないように配置する)。
ただし、プロットするデータが多い場合、best では凡例の位置を探索するのに時間が掛かるため、出来るだけ位置を指定する方がよい。

upper left upper center upper right
center left center center right
lower left lower center lower right
best

ncol: int型、optional
凡例の列数を指定。デフォルトは1.

fontsize: int型 or str型、optional
文字の大きさであり、数値で指定できる。
または、str型として以下のいずれかを指定可能。
{“xx-small”, “x-small”, “small”. “medium”, “large”, “x-large”, “xx-large”}

frameon: bool型、optional
枠の表示。デフォルト値は以下で確認できる。

1
mpl.rcParams["legend.frameon"]

framealpha: float型、optional
凡例の背景の透過度。0~1の範囲で指定し、値が小さいほど透明に近づく。
デフォルト値は以下で確認できる。

1
mpl.rcParams["legend.framealpha"]

facecolor:
凡例の背景色。デフォルト値は以下で確認できる。

1
mpl.rcParams["legend.facecolor"]

edgecolor
凡例の枠の色。デフォルト値は以下で確認できる。

1
mpl.rcParams["legend.edgecolor"]

title: str型
凡例のタイトル。

参考:
matplotlib.axes.Axes.legend — Matplotlib 3.3.3 documentation

グラフのグリッド

グラフにグリッドを引くときは、Axesオブジェクトのgridメソッドを使う。

1
Axes.grid(b=None, which='major', axis='both', **kwargs)

引数の型と意味は以下の通り。

b: bool型
グリッドのオン(True)・オフ(False)。
b=Noneかつkwargsを指定しない場合、グリッドのオン・オフを切り替える。
b=Noneかつkwargsを指定した場合、グリッドをオンにする。

which: str型
{“major”, “minor”, “both”}のいずれかを指定する。
それぞれ、主目盛 (major tick), 補助目盛 (monor tick), これら両方、においてグリッドを引くかを意味する。

axis: str型
グリッドを引く軸を{“both”, “x”, “y”}のいずれかから指定する。

**kwargs
Line 2Dオブジェクトであるグリッド線の色等のプロパティを指定する。
Line 2Dの詳細は次のページを参考。
matplotlib.lines.Line2D — Matplotlib 3.3.3 documentation

参考:
matplotlib.axes.Axes.grid — Matplotlib 3.3.3 documentation

グラフの保存

グラフをファイルとして保存するときは、Figureオブジェクトのsavefigメソッドを用いる。

1
Figure.savefig(fname, dpi=None, transparent=False)

引数の型と意味は以下の通り。

fname: str型
グラフを保存するファイルのディレクトリと名前。
ファイル名のみの場合は、現在のディレクトリに保存される。
ファイル名に拡張子を付けると、ファイルフォーマットは拡張子から自動で決定される。

dpi: スカラー
保存するグラフの解像度。オプション。dpiの初期値は以下のコマンドで確認できる。

1
mpl.rcParams["savefig.dpi"]

このコマンドで “figure” が返された場合、保存する画像の解像度はFigureオブジェクトの設定値になる。
Figureオブジェクトのdpiは、plt.subplots()などによる作成時に指定できる他、オブジェクト作成後もFigure.set_dpi(var)メソッドにより再指定できる。また、Figure.get_dpi()メソッドにより取得できる。

transparent: bool型
Trueならばグラフの背景を透過させる。デフォルト値はFalse
ただし、画像フォーマットが透過に対応している必要がある(pngなど)。

参考:
matplotlib.figure.Figure — Matplotlib 3.3.3 documentation

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。Twitterで新着記事を配信中です