メインコンテンツへスキップ

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

·2791 文字·6 分
目次

はじめに
#

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

環境
#

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

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

import matplotlib as mpl
import matplotlib.pyplot as plt

グラフのタイトル
#

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

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

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

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

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

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

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

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

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

例:

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
title

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

軸のラベル
#

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

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メソッドを使う。

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) とすると、軸の正負が反転する。なお、軸の反転は以下のメソッドでも行える。

Axes.invert_xaxis()
Axes.invert_yaxis()

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

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

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

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
set_lim

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

凡例の表示
#

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

Axes.legend(*args, **kwargs)

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

例1:

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

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

例2:

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 枠の表示。デフォルト値は以下で確認できる。

mpl.rcParams["legend.frameon"]

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

mpl.rcParams["legend.framealpha"]

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

mpl.rcParams["legend.facecolor"]

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

mpl.rcParams["legend.edgecolor"]

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

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

グラフのグリッド
#

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

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メソッドを用いる。

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

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

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

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

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
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

Matplotlibでオブジェクト指向なグラフ作成
·1842 文字·4 分
matplotlibライブラリを用いてオブジェクト指向スタイルでグラフを作成する。
Pythonのmultiprocessingを使った並列計算
·456 文字·1 分
Pythonの標準ライブラリmultiprocessingを使って並列計算を行う。
BeautifulSoupを使ったXMLの解析
·2390 文字·5 分
BeautifulSoupを使ってXMLを解析(parse)する。
NumPyで使える統計の関数
·673 文字·2 分
NumPyで利用できる統計の関数について。
NumPyで使える数学の関数
·1031 文字·3 分
NumPyで利用できる数学の関数について。
NumPy配列の演算
·1222 文字·3 分
NumPy配列の四則演算と線形代数学の演算について。