Helve’s Python memo

https://pm4da.blogspot.jp/ に移転中

<matplotlib> オブジェクト指向なグラフの調整

matplotlibライブラリで作成したグラフを、オブジェクト指向スタイルで調整する。
matplotlibの基本的なオブジェクトと、グラフ作成については以下ページを参照。
<matplotlib> オブジェクト指向なグラフ作成 - Helve’s Python memo

目次

環境

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クラスで指定できるパラメータ。
詳細は以下のページを参照。

text — Matplotlib 2.1.0 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()

実行結果:

f:id:Helve:20171203130159p:plain

参考:
matplotlib.axes.Axes.set_title — Matplotlib 2.1.0 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 2.1.0 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()

実行結果:
f:id:Helve:20171203130413p:plain

参考:
matplotlib.axes.Axes.set_xlim — Matplotlib 2.1.0.post996+g2f28286 documentation
matplotlib.axes.Axes.set_ylim — Matplotlib 2.1.0.post996+g2f28286 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:
f:id:Helve:20171203130445p:plain

なお、以下のように、ラベルが既に設定されている場合は、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

凡例の位置を以下のいずれかから指定可能。

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 2.1.0 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 2.1.0.post996+g2f28286 documentation

参考:
matplotlib.axes.Axes.grid — Matplotlib 2.1.0.post996+g2f28286 documentation


グラフの保存

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

Figure.savefig(fname, dpi=None)

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

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

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

mpl.rcParams["savefig.dpi"]

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

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

広告を非表示にする