web-dev-qa-db-ja.com

なぜ多くの例がMatplotlib/pyplot/pythonの "fig、ax = plt.subplots()"を使うのです

私は例を研究することによってmatplotlibを使うことを学びます、そして、多くの例は単一のプロットを作成する前に以下のような線を含むようです...

fig, ax = plt.subplots()

下記は用例です...

例では1つのグラフを作成しようとしているにすぎませんが、この関数は多用されています。他にも利点はありますか? subplots()の公式デモでも、単一のチャートを作成するときにf, ax = subplotsを使用しています。その後はaxを参照するだけです。これが彼らが使用するコードです。

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

plt.subplots()は、figureとaxesオブジェクトを含むTupleを返す関数です。したがってfig, ax = plt.subplots()を使うときは、このTupleを変数figaxに展開します。 Figureレベルの属性を変更したり、後でFigureをイメージファイルとして保存したい場合(fig.savefig('yourfilename.png')を使用する場合など)、figを使用すると便利です。返されたfigureオブジェクトを使用する必要はありません。また、すべてのAxesオブジェクト(プロッ​​トメソッドを持つオブジェクト)は、とにかく親figureオブジェクトを持ちます。

fig, ax = plt.subplots()

これよりもっと簡潔です:

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

ちょっと補足です。

次の質問は、図の中にもっと多くのサブプロットが欲しいとしたらどうなるかということです。

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つの要素を持つTupleを返すことがわかったので、これはエラーを引き起こしますが、心配しないでください。 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)

そのため、リストの構成は、図で設定したサブプロットグリッドと同じものにしてください。

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

30
Duskash

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

plt.subplots()を使用してすべてのサブプロットを一度に作成できます。サブプロットのFigureとAxes(Axesの複数)をTupleとして返します。フィギュアはあなたがあなたのスケッチをペイントするキャンバスとして理解することができます。

# 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)
ax3 = plt.subplot(2,1,3) 

ただし、plt.subplots()を使用すると、図形全体を直接カスタマイズするためのより簡単なオプションが得られるため、推奨されています。

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

Shared axes 一方、plt.subplot()では、各軸に対して個別に指定しなければならず、面倒になる可能性があります。

1
Light_B

上記の答えに加えて、Tupleを返すtype(plt.subplots())を使ってオブジェクトの型をチェックすることができます。一方、type(plt.subplot())matplotlib.axes._subplots.AxesSubplotを返します。これは解凍できません。

0
John T