YutaKaのPython教室

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

Matplotlib plt.subplots()の使い方|FigureとAxesを同時生成!

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

  • fig, ax = plt.subplots()って、よく見るけど何してるの?
  • plt.subplots()の便利な使い方を知りたい!

という方のために、

  • fig, ax = plt.subplots()で、FigureAxesを作ると何が便利なのか?
  • plt.subplots()の基本的な使い方
  • 覚えておくと便利なplt.subplots()の引数

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

この記事を読むと、fig, ax = plt.subplots()から始めるオブジェクト指向のグラフ作成がわかってくると思います!

 

なぜplt.subplots()を使うのか?

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

  • Figure:描画領域全体
  • Axes:一つ一つのプロットを描く領域

FigureAxesを一つずつ作成していく場合は、

  • fig = plt.figure()Figureを生成
  • fig.add_subplot()Axesを1個ずつ追加 or fig.suplots()Axesを複数追加

という手順を踏みます。

【補足】FigureAxesの関係/操作方法について、詳しく知りたい方は次の記事をチェックしてください

Matplotlib plt.figure()を使う理由|FigureとAxesの関係を把握しよう
Matplotlib plt.figure()を使う理由|FigureとAxesの関係を把握しよう
Matplotlibでグラフを描くとき「FigureとかAxesとかMatplotlib独特の単語が多くてよくわからない」、「Figureを作った後、結局どうやってプロットすればいいの?」という方のために、FigureとAxesの関係性を図解!FigureにAxesを追加する方法厳選3パターンを解説します!覚えておきたいFigureの設定・操作(サイズ変更、レイアウト調整など)も画像・サンプルコード付きで解説!
www.yutaka-note.com/entry/matplotlib_figure
 

しかし、Figureだけ作成して、Axesを作らないことってあまりないですよね。

結局両方作るなら、FigureAxesを同時に作成できた方が便利です。

そんな時に便利なのが、

  • fig, ax = plt.subplots()

これでFigureAxesを同時に生成できます。

この記事では、

  • plt.subplots()の基本|FigureAxesの生成方法
  • 覚えておくと便利な引数
    • Figureの見た目変更方法
    • サブプロット間でx軸、y軸を共有する方法

を紹介していきます。

plt.subplots()の基本|FigureとAxesの生成方法

plt.subplots()では、引数によって生成するAxes(サブプロット)の数を変更できます。

  • fig, ax = plt.subplots() 引数を省力:1つのサブプロットを生成
  • fig, axes = plt.subplots(nrows, ncols)nrows×ncols個のサブプロットを生成

次のサンプルデータを使用して、一つずつ紹介していきます。

%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
 

サブプロットを一つ生成|fig, ax = plt.subplots()

引数を省略するとサブプロットが一つだけ生成されます。

fig, ax = plt.subplots()
 
ax.plot(x, y)
 
plt.show()

axを生成した後は、ax.XXXを使用すれば様々な種類のグラフが描けます。

各種グラフの作成方法については、次の記事を参考にしてください。

  • 折れ線グラフ:ax..plot()
≫【完全保存版】Matplotlib plt.plot徹底解説 | 基本操作を総まとめ!
≫【完全保存版】Matplotlib plt.plot徹底解説 | 基本操作を総まとめ!
Matplotlibのplt.plotを使用したグラフを作成、グラフの見た目変更、タイトルや軸の設定など基本事項について徹底解説!!この記事を読めば、plt.plotで手軽に手早く簡単に、キレイなグラフ作成可能に!?
www.yutaka-note.com/entry/matplotlib_pyplot
 
  • 円グラフ:ax..pie()
≫Matplotlib 円グラフ作成方法|Excel風グラフ、ドーナツグラフも解説
≫Matplotlib 円グラフ作成方法|Excel風グラフ、ドーナツグラフも解説
Matplotlibで円グラフを作成する方法がよくわからない…。何を設定すれば、自分の描きたい円グラフになるのかわからない!という方のために、「Matplotlibの円グラフ作成方法」、「Excel風の見た目に設定する方法」、「グラフやラベルの設定方法」についてまとめしました!これで自由に円グラフを作成できます!
www.yutaka-note.com/entry/matplotlib_pie
 
  • 棒グラフ:ax..bar()
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
≫Matplotlib 棒グラフを徹底解説|複数系列・積み上げ棒グラフ全てOK
Matplotlibで棒グラフを作成する方法がよくわからない…。 棒グラフで悩むなら、MatplotlibあきらめてExcel使おうかな…。 と思ったことはありませんか?そんな方のために、Matplotlibの棒グラフ作成方法を徹底的に解説しました!複数系列?積み上げ棒グラフ?全部大丈夫!
www.yutaka-note.com/entry/matplotlib_bar
 
  • 散布図:ax..scatter()
≫Matplotlib 散布図を徹底解説!|基本設定からバブルチャートまで
≫Matplotlib 散布図を徹底解説!|基本設定からバブルチャートまで
Matplotlibで散布図を作成する方法がよくわからない…。散布図って何のためにあるの?全部、plt.plotでグラフ作ればよくない?という方のために、「Matplotlibの散布図の作成方法、散布図を応用したデータの可視化例」についてまとめしました!
www.yutaka-note.com/entry/matplotlib_scatter
 

サブプロットを複数生成|fig, axes = subplots(nrows, ncols)

Figure内に複数のサブプロットを配置したい場合は、

  • fig, axes = subplots(nrows, ncols)

のように引数でサブプロットの配置を指定します。この場合、

  • 図を縦にnrows個、横にncols個に分割
  • axesに各Axesオブジェクトを配列形式で格納

することになります。

例として、nrows=2, ncols=3で、サブプロットを作成してみます。

fig, axes = plt.subplots(2, 3, tight_layout=True)
 
plt.show()

次の図のように、

  • Figureに2×3個のサブプロットを作成
  • Axesを2×3の配列内に格納

されます。

各サブプロットにグラフを描きたいときは、axesの対応する要素のメソッドでグラフを描きます。

fig, axes = plt.subplots(2, 3, tight_layout=True)
 
axes[1,1].plot(x, y)
 
plt.show()

ここでは、tight_layout=Trueを指定して、サブプロットのレイアウトを調整しています(次節で解説)。

サブプロットの位置指定はplt.subplot()と同じ考え方なので、次の記事も参考にしてください。

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

axesを1次元配列で出力

fig, axes = subplots(nrows, ncols)axesを生成すると、サブプロットの配置によってaxesの形状が自動で調整されます。

  • nrows>1, ncols>1 ⇒ 二次元配列(サイズ:nrows*ncols
  • nrows=1, nrows>1 ⇒ 一次元配列(サイズ:ncols
  • ncols=1, nrows>1 ⇒ 一次元配列(サイズ:nrows
  • ncols=nrows=1 ⇒ ゼロ次元配列(Axesオブジェクトそのもの)

これは直感的でわかりやすい一方、配列の形状が変わってしまうと不便な場合もあります。

例えば、次のようなコードでは、列数nrows, 行数ncolsのどちらかが1になるとエラーになります。

nrows=2
ncols=1 
 
fig, axes = plt.subplots(nrows=nrows, ncols=ncols, tight_layout=True)
 
for i in range(nrows):
  for j in range(ncols):
    axes[i,j].plot(x, y)
    # IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

nrows=1 or ncols=1のとき、axesが一次元配列になるのでaxes[i]と書かないとエラーになります。

このためだけにif文で場合分けをするのはややめんどうです。

そういった場合は、

  • squeeze=False

を指定すると、axesが常に二次元配列で生成されます。

列数nrows, 行数ncolsによらず配列axesの形状が一定なので、場合分けが不要になりますね。

nrows=2
ncols=1 
 
# squeeze=Falseとしておけば、ncols=1でもaxes[i,j]と書ける
fig, axes = plt.subplots(nrows=nrows, ncols=ncols, squeeze=False, tight_layout=True)
 
for i in range(nrows):
  for j in range(ncols):
    axes[i,j].plot(x, y)
    axes[i,j].set_title(f"plot({i}, {j})")
 
plt.show()

nrows=1 or ncols=1でも対応可能になりました。これは結構便利です。

Figureの見た目変更|plt.figure()のキーワード引数を指定

plt.subplots()に、plt.figure()の引数をキーワード引数で与えてFigureの見た目を設定することもできます。

  • plt.subplots(figsize = (5, 5), tight_layout=True)など
fig, axes = plt.subplots(2,2, figsize=(5,5), tight_layout=True, facecolor="whitesmoke")
 
plt.show()

覚えておくと便利なplt.figure()のキーワード引数をまとめました。

設定内容 引数名 引数の指定方法
描画領域のサイズ変更 figsize (width, height) をインチで指定
デフォルト:(6.4, 4.8)
サブプロットのレイアウト自動調整 tight_layout True or False
デフォルト:False
Trueにすると自動調整
描画領域の背景色変更 facecolor 色名などで指定
デフォルト:'white'
描画領域の枠線表示 linewidth
edgecolor
linewidth = 数値pt
edgecolor = '色名など'

各引数の詳しい使い方は、次の記事をチェックしてください。

Matplotlib plt.figure()を使う理由|FigureとAxesの関係を把握しよう
Matplotlib plt.figure()を使う理由|FigureとAxesの関係を把握しよう
Matplotlibでグラフを描くとき「FigureとかAxesとかMatplotlib独特の単語が多くてよくわからない」、「Figureを作った後、結局どうやってプロットすればいいの?」という方のために、FigureとAxesの関係性を図解!FigureにAxesを追加する方法厳選3パターンを解説します!覚えておきたいFigureの設定・操作(サイズ変更、レイアウト調整など)も画像・サンプルコード付きで解説!
www.yutaka-note.com/entry/matplotlib_figure
 

特にサブプロットのレイアウトを自動調整するtight_layout=Trueはぜひ覚えてほしい引数です。

サブプロット間でx軸、y軸を共有|sharex, sharey

plt.subplots()で作成したAxesの軸は、それぞれのAxesで個別に自動調整されます。

そのため、Axesごとに軸の最大値/最小値が異なり、Axes間でのデータ比較が難しくなってしまう場合があります。

次の例では、Axesごとにy軸の最大値が自動調整されている例です。

fig, axes = plt.subplots(2, 2, tight_layout=True)
 
axes[0,0].plot(x, y)
axes[0,1].plot(x, 2*y)
axes[1,0].plot(x, 3*y)
axes[1,1].plot(x, 4*y)
 
plt.show()

一見すると全て同じグラフに見えてしまいますね。

こういった場合は

  • sharexAxes間でx軸を共有
  • shareyAxes間でy軸を共有

するとデータの比較がしやすくなります。

sharex, shareyの使用例

次の例ではsharey="all"を指定して、全てのAxesでy軸を共有しています。

fig, axes = plt.subplots(2, 2, sharey = "all", tight_layout=True)
 
axes[0,0].plot(x, y)
axes[0,1].plot(x, 2*y)
axes[1,0].plot(x, 3*y)
axes[1,1].plot(x, 4*y)
 
plt.show()

sharex, shareyの指定方法

sharex, shareyはそれぞれ

  • sharex = XXX:x軸の共有設定
  • sharey = XXX:y軸の共有設定

に対応しており、次の3種類の値を指定できます。

指定値 内容
"all" 全てのAxesで軸を共有
"row" 同じ行内のAxesで軸を共有
"col" 同じ列内のAxesで軸を共有

各指定値の組み合わせ例を確認していきましょう。

  • 全てのAxesでx軸/y軸を共有
fig, axes = plt.subplots(2, 2, sharex="all", sharey = "all", tight_layout=True)
 
axes[0,0].plot(x, y)
axes[0,1].plot(2*x, 2*y)
axes[1,0].plot(3*x, 3*y)
axes[1,1].plot(4*x, 4*y)
 
plt.show()

  • 同じ行内のAxesでy軸を共有
fig, axes = plt.subplots(2, 2, sharey="row", tight_layout=True)
 
axes[0,0].plot(x, y)
axes[0,1].plot(x, 2*y)
axes[1,0].plot(x, 3*y)
axes[1,1].plot(x, 4*y)
 
plt.show()

行ごとにy軸が共有されていますね。

  • 同じ列内のAxesでx軸を共有
fig, axes = plt.subplots(2, 2, sharex="col", tight_layout=True)
 
axes[0,0].plot(x, y)
axes[0,1].plot(2*x, y)
axes[1,0].plot(3*x, y)
axes[1,1].plot(4*x, y)
 
plt.show()

左列グループ、右列グループでそれぞれx軸が共有されています。

plt.subplots()まとめ

今回は、plt.subplots()の使い方について整理しました。

fig, ax = plt.subplots()を使用すれば、FigureとAxesを同時に作成できて便利なことが多いことがわかって頂けたと思います。

Matplotlibのオブジェクト指向でのグラフ作成のポイントがわかってきますね。

もっと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 plt.figure()を使う理由|FigureとAxesの関係を把握しよう
Matplotlib plt.figure()を使う理由|FigureとAxesの関係を把握しよう
Matplotlibでグラフを描くとき「FigureとかAxesとかMatplotlib独特の単語が多くてよくわからない」、「Figureを作った後、結局どうやってプロットすればいいの?」という方のために、FigureとAxesの関係性を図解!FigureにAxesを追加する方法厳選3パターンを解説します!覚えておきたいFigureの設定・操作(サイズ変更、レイアウト調整など)も画像・サンプルコード付きで解説!
www.yutaka-note.com/entry/matplotlib_figure
 

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

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