YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

Matplotlib plt.figure()を使う理由|FigureとAxesの関係を把握しよう

Pythonでグラフを描くときにはMatplotlibを使用することが多いですが…

  • FigureとかAxesとかMatplotlib独特の単語が多くてよくわからない!
  • Figureを作った後、結局どうやってプロットすればいいの?
  • Figureを作ると、グラフの何を設定できるの?

という方のために、

  • FigureAxesの関係性は?
  • FigureAxes(サブプロット)を追加する方法厳選3パターン
  • 覚えておきたいFigureの設定・操作(サイズ変更、レイアウト調整など)

を図解付きで解説していきます。

これでFigureAxesの関係がばっちりわかって、グラフも自由に操作できるようになってくると思います!

 

Matplotlibの描画領域Figureと座標軸Axes

Matplotlibでグラフを描く際の基本パーツとしてFigureAxesがあります。

  • Figure:描画領域全体
  • Axes:一つ一つのプロットを描く領域(座標軸)

Matplotlibでは、Figureという描画領域の中に、Axesという座標軸を描きます。

Figureの中に複数のAxesを並べて、複数のグラフを表示することもできます。

グラフは折れ線グラフだけでなく、棒グラフや円グラフももちろんOKです。

以下では、

  • FigureAxesを追加する方法3パターン
  • 覚えておきたいFigureのメソッド、引数

を紹介していきます。

Figureにプロットを追加する方法3選

Matplotlibで描画領域Figureオブジェクトを作成するには

  • fig = plt.figure()

を実行します。

しかし、これだけでは、描画領域が準備されるだけです。

プロットを描くためには、Axesを別途追加する必要があります。

fig = plt.figure()に続くAxesの追加方法としては、次の3パターンを紹介します。

  1. plt.plot()で追加
  2. fig.add_subplot()で追加
  3. 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()の詳細は、次の記事を参考にしてください。

≫【徹底図解】NumPy linspace | お手軽!等間隔の数列を作成
≫【徹底図解】NumPy linspace | お手軽!等間隔の数列を作成
NumPyで、等間隔の数列を作るにはどうすればいいの?!そんな疑問にお答えします。等間隔の数列を生成するには、NumPyの関数linspace()を使いましょう!この記事では、linspaceの使い方を、図解・サンプルコード付きで紹介します。類似関数arrangeとの使い分けについても、しっかり解説しています!
www.yutaka-note.com/entry/numpy_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()
≫【完全保存版】Matplotlib plt.plot徹底解説 | 基本操作を総まとめ!
≫【完全保存版】Matplotlib plt.plot徹底解説 | 基本操作を総まとめ!
Matplotlibのplt.plotを使用したグラフを作成、グラフの見た目変更、タイトルや軸の設定など基本事項について徹底解説!!この記事を読めば、plt.plotで手軽に手早く簡単に、キレイなグラフ作成可能に!?
www.yutaka-note.com/entry/matplotlib_pyplot
 
  • 円グラフ:plt.pie()
≫Matplotlib 円グラフ作成方法|Excel風グラフ、ドーナツグラフも解説
≫Matplotlib 円グラフ作成方法|Excel風グラフ、ドーナツグラフも解説
Matplotlibで円グラフを作成する方法がよくわからない…。何を設定すれば、自分の描きたい円グラフになるのかわからない!という方のために、「Matplotlibの円グラフ作成方法」、「Excel風の見た目に設定する方法」、「グラフやラベルの設定方法」についてまとめしました!これで自由に円グラフを作成できます!
www.yutaka-note.com/entry/matplotlib_pie
 
  • 棒グラフ:plt.bar()
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
Matplotlibで棒グラフを作成する方法がよくわからない…。 棒グラフで悩むなら、MatplotlibあきらめてExcel使おうかな…。 と思ったことはありませんか?そんな方のために、Matplotlibの棒グラフ作成方法を徹底的に解説しました!複数系列?積み上げ棒グラフ?全部大丈夫!
www.yutaka-note.com/entry/matplotlib_bar
 
  • 散布図:plt.scatter()
≫Matplotlib 散布図を徹底解説!|基本設定からバブルチャートまで
≫Matplotlib 散布図を徹底解説!|基本設定からバブルチャートまで
Matplotlibで散布図を作成する方法がよくわからない…。散布図って何のためにあるの?全部、plt.plotでグラフ作ればよくない?という方のために、「Matplotlibの散布図の作成方法、散布図を応用したデータの可視化例」についてまとめしました!
www.yutaka-note.com/entry/matplotlib_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()と同じ考え方なので、次の記事も参考にしてください。

≫Matplotlib subplotの使い方徹底図解!|一つの図に複数グラフを描く
≫Matplotlib subplotの使い方徹底図解!|一つの図に複数グラフを描く
Matplotlibで一つの図の中に複数のグラフを並べるにはどうすればいいの?subplotでグラフを並べられるらしいけど、使い方がよくわからない!という方のために、「plt.subplot()の基本的な使い方」を画像付きで解説していきます!plt.subplot()でプロットをキレイに配置して、見やすく人に伝わるグラフを目指しましょう!
www.yutaka-note.com/entry/2020/01/02/232925
 

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の関係まとめ

FigureAxesの関係、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) :単位はインチ

を指定します。

widthheightに同じ値を与えると、描画領域が正方形になります。

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の背景色も変更したい場合は、別途Axesfacecolorも変更する必要があります。

fig = plt.figure(facecolor="whitesmoke") 
ax = fig.add_subplot(facecolor="whitesmoke")
ax.plot(x,y)
 
plt.show()

【参考】色の設定について詳しく知りたい方はこちらをチェック!

≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 

描画領域の枠線表示

描画領域に枠線を表示するには

  • 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()

【参考】テキスト、色の設定について詳しく知りたい方はこちらをチェック!

≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
グラフ内にテキストでコメントを記入することってよくありますよね?グラフにコメントがあると、グラフの大事な部分を強調して説明できます。この記事では、matplotlibでグラフ内にテキストを表示する方法、テキストの見た目の変更方法について図解・サンプルコード付きで解説しています!
www.yutaka-note.com/entry/2020/01/08/080413
 
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 

サブプロットのタイトルは、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(保存先フォルダ/ファイル名.拡張子):フォルダを指定して保存

を実行します。

拡張子としては、pngjpegtiffpdfなどが指定できます。

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まとめ

今回はmatplotlibFigureオブジェクトに注目して、

  • FigureAxesの関係性
  • FigureAxes(サブプロット)を追加する方法厳選3パターン
  • 覚えておきたいFigureの設定や操作(サイズ変更、レイアウト調整方法など)

を紹介しました。

Figureオブジェクトが描画領域に対応していて、どんな操作ができるかがわかってきたと思います。

もっとMatplotlibを自由自在に操作したい!という方へのおススメコンテンツはこちらです!

≫matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業
≫matplotlib inline の謎解明! |「書けと言われたので書いています」から卒業
Jupyter Notebookでmatplotlibを使用する場合には、インポートする前に%matplotlib inlineと記述します。なぜinlineと入力しているのでしょうか?この記事では、matplotlib inlineの謎について解説していきたいと思います!
www.yutaka-note.com/entry/matplotlib_inline
 
≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
≫matplotlib pyplot.text |matplotlibのテキスト表示をマスターせよ!
グラフ内にテキストでコメントを記入することってよくありますよね?グラフにコメントがあると、グラフの大事な部分を強調して説明できます。この記事では、matplotlibでグラフ内にテキストを表示する方法、テキストの見た目の変更方法について図解・サンプルコード付きで解説しています!
www.yutaka-note.com/entry/2020/01/08/080413
 
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
≫matplotlib color 色の指定 | 一文字指定からカラーマップの使い方まで徹底解説
伝わるグラフを作るためのポイントはなんでしょうか?いかに視覚的にわかりやすいか、これが大切です。それには重要な要素に色をつけて、視覚的にうったえることが超大切!この記事では、matplotlibでの色の指定方法について、基本から応用まで徹底解説!
www.yutaka-note.com/entry/matplotlib_color
 
≫Matplotlib 軸周り完璧マスターガイド | 軸・軸目盛・目盛り線の設定
≫Matplotlib 軸周り完璧マスターガイド | 軸・軸目盛・目盛り線の設定
Matplotlibで大変なのが軸周りの設定!グラフの「この要素」を変更するには、「どのメソッド」を使えばいいのかわからない…。という方のために、Matplotlibの軸・目盛り・目盛り線の設定について総まとめしました!これで軸周りの設定がだいぶ楽になります。軸周り完ぺきマスターガイド!
www.yutaka-note.com/entry/matplotlib_axis
 
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
Matplotlibで棒グラフを作成する方法がよくわからない…。 棒グラフで悩むなら、MatplotlibあきらめてExcel使おうかな…。 と思ったことはありませんか?そんな方のために、Matplotlibの棒グラフ作成方法を徹底的に解説しました!複数系列?積み上げ棒グラフ?全部大丈夫!
www.yutaka-note.com/entry/matplotlib_bar
 
≫Matplotlib 散布図を徹底解説!|基本設定からバブルチャートまで
≫Matplotlib 散布図を徹底解説!|基本設定からバブルチャートまで
Matplotlibで散布図を作成する方法がよくわからない…。散布図って何のためにあるの?全部、plt.plotでグラフ作ればよくない?という方のために、「Matplotlibの散布図の作成方法、散布図を応用したデータの可視化例」についてまとめしました!
www.yutaka-note.com/entry/matplotlib_scatter
 
≫Matplotlib 円グラフ作成方法|Excel風グラフ、ドーナツグラフも解説
≫Matplotlib 円グラフ作成方法|Excel風グラフ、ドーナツグラフも解説
Matplotlibで円グラフを作成する方法がよくわからない…。何を設定すれば、自分の描きたい円グラフになるのかわからない!という方のために、「Matplotlibの円グラフ作成方法」、「Excel風の見た目に設定する方法」、「グラフやラベルの設定方法」についてまとめしました!これで自由に円グラフを作成できます!
www.yutaka-note.com/entry/matplotlib_pie
 
≫Matplotlib subplotの使い方徹底図解!|一つの図に複数グラフを描く
≫Matplotlib subplotの使い方徹底図解!|一つの図に複数グラフを描く
Matplotlibで一つの図の中に複数のグラフを並べるにはどうすればいいの?subplotでグラフを並べられるらしいけど、使い方がよくわからない!という方のために、「plt.subplot()の基本的な使い方」を画像付きで解説していきます!plt.subplot()でプロットをキレイに配置して、見やすく人に伝わるグラフを目指しましょう!
www.yutaka-note.com/entry/2020/01/02/232925
 
≫【完全保存版】Matplotlib plt.plot徹底解説 | 基本操作を総まとめ!
≫【完全保存版】Matplotlib plt.plot徹底解説 | 基本操作を総まとめ!
Matplotlibのplt.plotを使用したグラフを作成、グラフの見た目変更、タイトルや軸の設定など基本事項について徹底解説!!この記事を読めば、plt.plotで手軽に手早く簡単に、キレイなグラフ作成可能に!?
www.yutaka-note.com/entry/matplotlib_pyplot
 
≫Matplotlib アニメーション作成入門編 |ArtistAnimation徹底解説!
≫Matplotlib アニメーション作成入門編 |ArtistAnimation徹底解説!
Matplotlibではアニメーションも作成できますが、初めての人には少し複雑です…。「 Matplotlibでアニメーションを描きたいけど、何から始めればいいの?」という方のために、 Matplotlibでアニメーションを超簡単に作成・保存する方法、アニメーション作成用の超基本テンプレを画像・サンプルコード付きで紹介していきます!
www.yutaka-note.com/entry/matplotlib_artist_anim
 
≫Matplotlib FuncAnimation徹底解説|更新用関数はこう作ればいい!
≫Matplotlib FuncAnimation徹底解説|更新用関数はこう作ればいい!
Matplotlibではアニメーションも作成できますが、初めての人には少し複雑です…。「Matplotlibでアニメーションを描きたいけど、よくわからない!」、「FuncAnimationで更新用関数作るって何?意味不明!!」という方のために、FuncAnimationでアニメーションを作成する超基本、更新用関数の作成方法、重要メソッドを画像・サンプルコード付きで紹介していきます!
www.yutaka-note.com/entry/matplotlib_func_anim
 
≫Matplotlib FigureとAxesの関係|グラフのレイアウトをマスターせよ!
≫Matplotlib FigureとAxesの関係|グラフのレイアウトをマスターせよ!
Pythonでグラフを描くときにはMatplotlibを使用することが多いですが…。「FigureとかAxesとかMatplotlib独特の単語が多くてよくわからない」、「Figureを作った後、結局どうやってプロットすればいいの?」という方のために、FigureとAxesの関係性を図解!FigureにAxes(サブプロット)を追加する方法厳選3パターンを解説します!他にも覚えておきたいFigureの設定・操作(サイズ変更、レイアウト調整など)も画像・サンプルコード付きで解説!
www.yutaka-note.com/entry/matplotlib_figure
 

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!