Pythonでグラフを描くときにはMatplotlib
を使用することが多いですが…
Figure
とかAxes
とかMatplotlib
独特の単語が多くてよくわからない!Figure
を作った後、結局どうやってプロットすればいいの?Figure
を作ると、グラフの何を設定できるの?
という方のために、
Figure
とAxes
の関係性は?Figure
にAxes
(サブプロット)を追加する方法厳選3パターン- 覚えておきたい
Figure
の設定・操作(サイズ変更、レイアウト調整など)
を図解付きで解説していきます。
これでFigure
とAxes
の関係がばっちりわかって、グラフも自由に操作できるようになってくると思います!
Matplotlibの描画領域Figureと座標軸Axes
Matplotlib
でグラフを描く際の基本パーツとしてFigure
とAxes
があります。
Figure
:描画領域全体Axes
:一つ一つのプロットを描く領域(座標軸)
Matplotlib
では、Figure
という描画領域の中に、Axes
という座標軸を描きます。
Figure
の中に複数のAxes
を並べて、複数のグラフを表示することもできます。
グラフは折れ線グラフだけでなく、棒グラフや円グラフももちろんOKです。
以下では、
Figure
にAxes
を追加する方法3パターン- 覚えておきたい
Figure
のメソッド、引数
を紹介していきます。
Figureにプロットを追加する方法3選
Matplotlib
で描画領域Figure
オブジェクトを作成するには
fig = plt.figure()
を実行します。
しかし、これだけでは、描画領域が準備されるだけです。
プロットを描くためには、Axes
を別途追加する必要があります。
fig = plt.figure()
に続くAxes
の追加方法としては、次の3パターンを紹介します。
plt.plot()
で追加fig.add_subplot()
で追加fig.subplots()
で追加
次のサンプルデータを使用して、一つずつ紹介していきます。
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3)
y = x**2
サンプルデータは、[-3,3]の範囲の二次曲線です。
np.linspace()
の詳細は、次の記事を参考にしてください。
plt.plot()で追加
fig = plt.figure()
で描画領域を作成した後は、plt.plot()
などでグラフを描いていく方法です。
fig = plt.figure() #実はこの行は省略できる
plt.plot(x,y)
plt.show()
次のようなグラフが描けます。
しかし、plt.plot()
を実行すると自動でFigure
オブジェクトも作成されるので、plt.figure()
は割愛できます。
plt.plot(x,y)
plt.show()
これでも同じグラフが描けるので、デフォルトのFigure
を作成する場合には、意味がありません。
このパターンは、次の例のようにFigure
オブジェクトの詳細設定を変更する場合に使用します。
fig = plt.figure(figsize = (5,5), facecolor="lightgray")
plt.plot(x,y)
plt.show()
plt.XXX
を使用すれば様々な種類のグラフが描けます。
各種グラフの作成方法については、次の記事を参考にしてください。
- 折れ線グラフ:
plt.plot()
- 円グラフ:
plt.pie()
- 棒グラフ:
plt.bar()
- 散布図:
plt.scatter()
fig.add_subplot()で追加
fig = plt.figure()
で描画領域を作成した後に、
ax = fig.add_subplot()
でAxes
を追加ax.plot()
やax.bar()
などでグラフを作成
していく方法です。
①Figure内に1個のプロットを作成
ax = fig.add_subplot()
で引数を省略すると、Figure
内にAxes
を1つ配置することができます。
fig = plt.figure()
ax = fig.add_subplot()
ax.plot(x,y)
plt.show()
②Figure内に複数プロットを作成
Figure
内に複数プロットを配置する場合は、
ax = fig.add_subplot(LMN)
またはax = fig.add_subplot(L, M, N)
のように引数でsubplot
の配置を指定します。この場合、
- 図を縦に
L
個、横にM
個に分割 - 左上から数えて
N
番目の領域にAxes
オブジェクト作成
されることになります。
例えば、縦に2分割(L = 2
)、横に3分割(M = 3
)した際の、各サブプロットの場所は下図のようになります。
Axes
オブジェクトを作成したら、ax.plot()
やax.bar()
などを使ってグラフを描きます。
fig = plt.figure()
# add_subplot(L, M, N)形式
ax1 = fig.add_subplot(1,2,1)
ax1.plot(x,y)
# add_subplot(LMN)形式
ax2 = fig.add_subplot(122)
x2 = np.arange(10)
ax2.bar(x2, 2**x2)
plt.show()
サブプロットの位置指定はplt.subplot()
と同じ考え方なので、次の記事も参考にしてください。
fig.subplots()で追加
fig.add_subplot(LMN)
の場合は、Axes
を一個ずつ追加していくので、量が多いと冗長なコードになりがちです。
そういった場合、fig.subplots()
を使用すると複数のAxes
を同時に複数生成できます。
axes = fig.subplots(nrows, ncols)
- 図を縦に
nrows
個、横にncols
個に分割 axes
に各Axes
オブジェクトを配列形式で格納
例として、nrows=2
, ncols=3
で、サブプロットを作成してみます。
fig = plt.figure(tight_layout=True)
axes = fig.subplots(2, 3)
plt.show()
下図のように、
Figure
に2×3個のサブプロットを作成Axes
を2×3の配列内に格納
されます。
各サブプロットにグラフを描きたいときは、axes
の対応する要素のメソッドでグラフを描きます。
fig = plt.figure(tight_layout=True)
axes = fig.subplots(2, 3)
axes[1,1].plot(x, y)
plt.show()
ここでは、tight_layout=True
を指定して、サブプロットのレイアウトを調整しています(次節で解説)。
FigureとAxesの関係まとめ
Figure
とAxes
の関係、Axes
の追加方法をまとめると次の図のようになります。
覚えておきたいFigureの引数
覚えておくと便利なFigure
の引数を紹介します。
設定内容 | 引数名 | 引数の指定方法 |
---|---|---|
描画領域のサイズ変更 | figsize |
(width, height) をインチで指定デフォルト: (6.4, 4.8) |
サブプロットのレイアウト自動調整 | tight_layout |
True or False デフォルト: False True にすると自動調整 |
描画領域の背景色変更 | facecolor |
色名などで指定 デフォルト: 'white' |
描画領域の枠線表示 | linewidth edgecolor |
linewidth = 数値pt edgecolor = '色名など' |
描画領域のサイズ変更
描画領域のサイズを変更するには、
figsize=(width, height)
:単位はインチ
を指定します。
width
とheight
に同じ値を与えると、描画領域が正方形になります。
fig = plt.figure(figsize=(3, 3)) # width = height = 3にしたパターン
ax = fig.add_subplot()
ax.plot(x,y)
plt.show()
サブプロットのレイアウト自動調整
サブプロットが多くなると、目盛りが重なってしまうなど見栄えが悪くなることがあります。
fig = plt.figure()
axes = fig.subplots(2,2)
plt.show()
こういった場合は、
tight_layout=True
を指定すると、サブプロットのレイアウトをある程度自動で調整してくれます。
fig = plt.figure(tight_layout=True)
axes = fig.subplots(2,2)
# サブプロットにタイトル追加
axes[0,0].set_title("subplot_0")
axes[1,1].set_title("subplot_3")
# サブプロットに軸ラベル追加
axes[0,1].set_xlabel("x-label")
axes[0,1].set_ylabel("y-label")
plt.show()
タイトルや軸ラベルがあると、それも踏まえて自動調整するので、覚えておくとかなり便利です。
描画領域の背景色変更
描画領域の背景色は
facecolor = '色名など'
で指定します。
fig = plt.figure(facecolor="whitesmoke")
ax = fig.add_subplot()
ax.plot(x,y)
plt.show()
Axes
の背景色も変更したい場合は、別途Axes
のfacecolor
も変更する必要があります。
fig = plt.figure(facecolor="whitesmoke")
ax = fig.add_subplot(facecolor="whitesmoke")
ax.plot(x,y)
plt.show()
【参考】色の設定について詳しく知りたい方はこちらをチェック!
描画領域の枠線表示
描画領域に枠線を表示するには
linewidth = 数値pt
edgecolor = '色名など'
の2つを指定します。
edgecolor
のデフォルトが'white'
なので、linewidth
で線の太さを指定するだけだと白くて見えません。
fig = plt.figure(edgecolor="red", linewidth=5)
ax = fig.add_subplot()
ax.plot(x,y)
plt.show()
覚えておきたいFigureのメソッド
ぜひ覚えておきたいFigure
のメソッドを紹介します。
実行内容 | メソッド名 | 引数例 |
---|---|---|
グラフタイトル設定 | fig.suptitle() |
"figure_title |
Subplotのレイアウト調整 | fig. subplots_adjust() |
サブプロットの位置や間隔top , bottom , right , left :上下左右位置wspace , hspvae :縦横のサブプロット間隔 |
画像の出力/保存 | fig.save() |
"ファイル名.拡張子" "保存先フォルダ/ファイル名.拡張子" |
グラフタイトル設定
グラフにタイトルを設定するには
fig.suptitle("figure_title")
を実行します。
fig = plt.figure()
ax = fig.add_subplot()
fig.suptitle("figure title")
fig.show()
plt.text()
と同様にキーワード引数でサイズや色なども設定できます。
fig = plt.figure()
ax = fig.add_subplot()
fig.suptitle("figure title", size="xx-large", color="blue", weight="bold")
fig.show()
【参考】テキスト、色の設定について詳しく知りたい方はこちらをチェック!
サブプロットのタイトルは、ax.set_title("sub_title")
で別途指定できます。
グラフタイトルとサブプロットタイトルを併記したい場合は、
fig.suptitle()
:グラフタイトル設定ax.set_title()
:サブプロットタイトル設定
を併用しましょう
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.set_title("subplot1")
ax2 = fig.add_subplot(122)
ax2.set_title("subplot2")
fig.suptitle("figure title", size="xx-large")
fig.show()
subplotのレイアウト手動調整
引数のtight_layout=True
でレイアウトを自動調整できることを紹介しました。
しかし、tight_layout
では、グラフタイトルのレイアウトは考慮されません。
fig = plt.figure(tight_layout=True)
ases = fig.subplots(2,2)
fig.suptitle("figure_title
two_lines", size="xx-large")
plt.show()
グラフタイトルが重なってしまいました。
この場合は、fig.subplots_adjust()
で調整します。
fig.subplots_adjust()
の引数は次の通りです。
引数 | 指定内容 | 指定値 |
---|---|---|
top |
サブプロットの上端位置 | Figureの横幅に対する割合0~1 |
bottom |
サブプロットの下端位置 | Figureの横幅に対する割合0~1 |
right |
サブプロットの右端位置 | Figureの高さに対する割合0~1 |
left |
サブプロットの左端位置 | Figureの高さに対する割合0~1 |
wspace |
サブプロットの横方向の間隔 | Axes の横幅平均値に対する割合0~1 |
hspace |
サブプロットの縦方向の間隔 | Axes の高さ平均値に対する割合0~1 |
指定内容を図解すると下図のようになります。
top
を指定して、グラフタイトルをプロットに重ならないように表示してみます。
fig = plt.figure()
ases = fig.subplots(2,2)
fig.suptitle("figure_title
two_lines", size="xx-large")
fig.subplots_adjust(top=0.8, wspace=0.4, hspace=0.4)
plt.show()
tight_layout=True
と併用することができないので、wspace
, hspace
も指定しています。
画像の出力/保存
画像を出力、保存するには
fig.savefig(ファイル名.拡張子)
:カレントフォルダに保存fig.savefig(保存先フォルダ/ファイル名.拡張子)
:フォルダを指定して保存
を実行します。
拡張子としては、png
、jpeg
、tiff
、pdf
などが指定できます。
fig = plt.figure()
ax = fig.add_subplot()
ax.plot(x,y)
#カレントフォルダにtest.pngとして保存
fig.savefig("../test.png")
#imgフォルダにtest.jpgとして保存
fig.savefig("./img/test.jpg")
Figureまとめ
今回はmatplotlib
のFigure
オブジェクトに注目して、
Figure
とAxes
の関係性Figure
にAxes
(サブプロット)を追加する方法厳選3パターン- 覚えておきたい
Figure
の設定や操作(サイズ変更、レイアウト調整方法など)
を紹介しました。
Figure
オブジェクトが描画領域に対応していて、どんな操作ができるかがわかってきたと思います。
もっとMatplotlib
を自由自在に操作したい!という方へのおススメコンテンツはこちらです!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!