matplotlibで複数のサブプロットを取得するにはどうすればよいですか?


156

私はこのコードがどのように機能するかについて少し混乱しています:

fig, axes = plt.subplots(nrows=2, ncols=2)
plt.show()

この場合、イチジク、軸はどのように機能しますか?それは何をするためのものか?

また、なぜこれが同じことをしないのですか?

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

1
matplotlib 2.1以降では、2番目のコードが機能します。
フェルミパラドックス

回答:


210

それを行うにはいくつかの方法があります。このsubplotsメソッドは、図に加えてax配列に格納されるサブプロットを作成します。例えば:

import matplotlib.pyplot as plt

x = range(10)
y = range(10)

fig, ax = plt.subplots(nrows=2, ncols=2)

for row in ax:
    for col in row:
        col.plot(x, y)

plt.show()

ここに画像の説明を入力してください

ただし、次のようなものも機能しますが、サブプロットを使用してFigureを作成し、その上に追加するため、それほどクリーンではありません。

fig = plt.figure()

plt.subplot(2, 2, 1)
plt.plot(x, y)

plt.subplot(2, 2, 2)
plt.plot(x, y)

plt.subplot(2, 2, 3)
plt.plot(x, y)

plt.subplot(2, 2, 4)
plt.plot(x, y)

plt.show()

ここに画像の説明を入力してください


4
代わりにplot(x, y)、ユーザー定義関数からのプロットがあり、networkxでグラフを作成します。どうやって使うのですか?
Sigur

forループなしで複数のサブプロットを作成することは可能ですか?たとえば、複数のデータ列を別々のプロットにプロットするためのいくつかのベクトル化されたソリューション?これはRのggplotでは非常に簡単ですが、Pythonでは不可能のようです。
user2739472

3
axn = ax.flatten()その後 、2つのforループを1つに減らすことができますfor axes in axn: axes.plot(x,y)
wander95

@ wander95 THANK YOUこの答えは、あなたなしではcol = 1またはrow = 1に対して機能しません
Gulzar

48
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)

ax[0, 0].plot(range(10), 'r') #row=0, col=0
ax[1, 0].plot(range(10), 'b') #row=1, col=0
ax[0, 1].plot(range(10), 'g') #row=0, col=1
ax[1, 1].plot(range(10), 'k') #row=1, col=1
plt.show()

ここに画像の説明を入力してください


1
何であるかaxはわかりますが、何であるかはわかりませんfig。彼らは何ですか?
Leevo

3
axは実際には数の多い配列です。figはmatplotlib.figure.Figure、プロットされたFigureに対して多くの操作を行うことができるクラスです。たとえば、特定のサブプロットにカラーバーを追加したり、すべてのサブプロットの背景色を変更したりできます。これらのサブプロットのレイアウトを変更するか、それらに新しい小さな斧を追加できます。fig.suptitle(title)メソッドで取得できるすべてのサブプロットに単一のメインタイトルが必要な場合があります。最後に、プロットに満足したら、fig.savefigメソッドを使用してプロットを保存できます。@Leevo
Khalil Al Hooti

21
  • サブプロット呼び出しで座標軸をアンパックすることもできます

  • そして、サブプロット間でx軸とy軸を共有するかどうかを設定します

このような:

import matplotlib.pyplot as plt
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
ax1.plot(range(10), 'r')
ax2.plot(range(10), 'b')
ax3.plot(range(10), 'g')
ax4.plot(range(10), 'k')
plt.show()

ここに画像の説明を入力してください


14

matplotlibバージョン2.1以降では、質問の2番目のコードも正常に機能するという事実に興味があるかもしれません。

変更ログから:

Figureクラスにsubplotsメソッドが追加されました。Figureクラスにsubplots()メソッドが追加されました。これは、pyplot.subplots()と同じように動作しますが、既存のFigureに対して実行されます。

例:

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

plt.show()

取得:AttributeErrorトレースバック(最後の最新の呼び出し)<ipython-input-168-ed25aa5255fa> in <モジュール>()2 3 fig = plt.figure()----> 4軸= fig.subplots(nrows = 2 、ncols = 2)AttributeError: 'Figure' object has no attribute 'subplots'
Ludo Schmidt

1
@LudoSchmidt答えは「matplotlibバージョン2.1以降...」
ImportanceOfBeingErnest

11

ドキュメントを読む:matplotlib.pyplot.subplots

pyplot.subplots()fig, ax表記法を使用して2つの変数にアンパックされたタプルを返します

fig, axes = plt.subplots(nrows=2, ncols=2)

コード

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

はオブジェクトのメンバーではないsubplots()関数なので、機能しpyplotませんFigure

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.