多くの例がMatplotlib / pyplot / pythonで `fig、ax = plt.subplots()`を使用する理由


267

私はmatplotlib例を研究することで使い方を学んでいます、そして多くの例は単一のプロットを作成する前に次のような行を含むようです...

fig, ax = plt.subplots()

下記は用例です...

この例では単一のグラフを作成することだけを試みていますが、この関数がよく使われているのがわかります。他に利点はありますか?の公式デモは、単一のグラフを作成するときにsubplots()も使用f, ax = subplotsし、それ以降はaxのみを参照します。これは彼らが使用するコードです。

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')

11
まあ、それは短くて簡潔で、1つのステップで図と軸の両方の参照2を取得します。美しいので、それはpythonicです:)
cel

回答:


325

plt.subplots()FigureとAxesオブジェクトを含むタプルを返す関数です。したがって、使用fig, ax = plt.subplots()するときは、このタプルを変数figandにアンパックしますax。持つことは、figあなたがイメージファイルとして図後で(例えば変化フィギュアレベルの属性または保存したい場合に便利ですfig.savefig('yourfilename.png'))。確かに、返されたFigureオブジェクトを使用する必要はありませんが、多くの人が後で使用するため、よく見られます。また、すべてのAxesオブジェクト(プロッ​​トメソッドを持つオブジェクト)には、とにかく親のFigureオブジェクトがあるため、次のようになります。

fig, ax = plt.subplots()

これよりも簡潔です:

fig = plt.figure()
ax = fig.add_subplot(111)

8
とても良い説明。ここでのドキュメントがある- matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7は

2
サブプロットのパラメーターとして常に111を使用するのはなぜですか?
Priyansh 2017

@PriyanshはMatlab構文から継承されているため
pcko1

@Priyansh常にではありません。4つのグラフが必要な場合は、(またはそれぞれ222、223、224)ax11, ax12, ax21, ax22を使用して作成できますfig.add_subplot(221)
ギムート

49

ここでは補足です。

次の質問は、図にさらに多くのサブプロットが必要な場合はどうなりますか?

Docで述べたように、fig = plt.subplots(nrows=2, ncols=2)1つのFigureオブジェクトでgrid(2,2)を使用してサブプロットのグループを設定するために使用できます。

次に、知っているように、fig, ax = plt.subplots()はタプルを返しますfig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)。最初に試しましょう。

ValueError: not enough values to unpack (expected 4, got 2)

エラーが発生しますが、plt.subplots()実際には2つの要素を持つタプルを返すことがわかるため、心配する必要はありません。1つ目はFigureオブジェクトで、もう1つはサブプロットオブジェクトのグループでなければなりません。

もう一度試してみましょう:

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(nrows=2, ncols=2)

タイプを確認してください:

type(fig) #<class 'matplotlib.figure.Figure'>
type(ax1) #<class 'matplotlib.axes._subplots.AxesSubplot'>

もちろん、パラメーターを(nrows = 1、ncols = 4)として使用する場合、フォーマットは次のようになります。

fig, [ax1, ax2, ax3, ax4] = plt.subplots(nrows=1, ncols=4)

したがって、リストの構成を、図で設定したサブプロットグリッドと同じに保つことを忘れないでください。

これがあなたに役立つことを願っています。


2
サブプロットにタイトルがある場合は、忘れずにplt.tight_layout()を追加してください
gota

12
サブプロットがたくさんある場合はどうなりますか?この方法を使用する方が簡単です:fig, axes = plt.subplots(nrows=10, ncols=3)およびaxes = axes.flatten()。今、あなたはそのインデックスにより、各サブプロットを参照することができます:axes[0]axes[1]、...
ギヨーム

これらのサブプロットの1つが複数の列または行にまたがるようにしたい場合はどうなりますか?subplotsコマンドで実行できますか?
下田

1
@BallpointBen ifが機能するかどうかは不明です。その場合nrows=1axes長さが等しいフラットな状態で返されますncols
Ben

1
@BallpointBenこれを実行することでこれを修正できることに気づきました:fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
Ben

15

質問と上記の回答の補足として、との間にも重要な違いがplt.subplots()あります。最後のplt.subplot()欠落に注意してください's'

を使用plt.subplots()してすべてのサブプロットを一度に作成でき、サブプロットの図と軸(複数の軸)をタプルとして返します。フィギュアは、スケッチを描くキャンバスとして理解できます。

# create a subplot with 2 rows and 1 columns
fig, ax = plt.subplots(2,1)

一方、plt.subplot()サブプロットを個別に追加する場合に使用できます。1つのサブプロットの軸のみを返します。

fig = plt.figure() # create the canvas for plotting
ax1 = plt.subplot(2,1,1) 
# (2,1,1) indicates total number of rows, columns, and figure number respectively
ax2 = plt.subplot(2,1,2)

ただし、plt.subplots()図全体を直接カスタマイズするための簡単なオプションが提供されるため、推奨されます

# for example, sharing x-axis, y-axis for all subplots can be specified at once
fig, ax = plt.subplots(2,2, sharex=True, sharey=True)

共有軸 一方、ではplt.subplot()、面倒になる可能性のある各軸を個別に指定する必要があります。


1
ax3 = plt.subplot(2,1,3) 2 行1列で、グラフが2つしかないため、コード行は機能しません。
Cloud Cho、

1
ありがとう、修正しました。最後のコードブロックで必要な別の変更がありました。
Light_B

3

上記の回答に加えて、あなたが使用して、オブジェクトの種類をチェックすることができtype(plt.subplots())、一方、タプルを返すtype(plt.subplot())戻っmatplotlib.axes._subplots.AxesSubplotたあなたはアンパックできません。


4
Stack Overflowへようこそ!これは実際にはコメントであり、回答ではありません。もう少し担当者がいると、コメントを投稿できるようになります。ありがとう!
Miroslav Glamuzina
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.