web-dev-qa-db-ja.com

1つの図に10を超えるサブプロットを作成するにはどうすればよいですか?

私はサブプロットの5x4グリッドを作成しようとしていますが、例を見ると、最善の方法は次のように思われます。

import matplotlib.pyplot as plt
plt.figure()
plt.subplot(221)

ここで、サブプロット(22)の最初の2つの数字は、それが2x2グリッドであることを示し、3番目の数字は4つのうちのどれを作成しているかを示します。しかし、私がこれを試したとき、私は上に行かなければなりませんでした:

plt.subplot(5420)

そして私はエラーが発生しました:

ValueError: Integer subplot specification must be a three digit number.  Not 4

つまり、10を超えるサブプロットを作成できないということですか、それを回避する方法はありますか、それとも私はそれがどのように機能するかを誤解していますか?

前もって感謝します。

8
Sam V

あなたはおそらく GridSpec を探しています。グリッドのサイズ(5,4)と各プロットの位置(行= 0、列= 2、つまり-0,2)を指定できます。次の例を確認してください。

import matplotlib.pyplot as plt

plt.figure(0)
ax1 = plt.subplot2grid((5,4), (0,0))
ax2 = plt.subplot2grid((5,4), (1,1))
ax3 = plt.subplot2grid((5,4), (2, 2))
ax4 = plt.subplot2grid((5,4), (3, 3))
ax5 = plt.subplot2grid((5,4), (4, 0))
plt.show()

、その結果:

gridspec matplotlib example

ネストされたループを作成して完全なグリッドを作成する必要があります。

import matplotlib.pyplot as plt

plt.figure(0)
for i in range(5):
    for j in range(4):
        plt.subplot2grid((5,4), (i,j))
plt.show()

、これを取得します:

full 5x4 grid in gridspec matplotlib

プロットは、他のサブプロットと同じように機能します(作成した軸から直接呼び出します)。

import matplotlib.pyplot as plt
import numpy as np

plt.figure(0)
plots = []
for i in range(5):
    for j in range(4):
        ax = plt.subplot2grid((5,4), (i,j))
        ax.scatter(range(20),range(20)+np.random.randint(-5,5,20))
plt.show()

、結果として:

multiple scatterplots in gridspec

プロットにさまざまなサイズを指定できることに注意してください(各プロットの列と行の数を示します)。

import matplotlib.pyplot as plt

plt.figure(0)
ax1 = plt.subplot2grid((3,3), (0,0), colspan=3)
ax2 = plt.subplot2grid((3,3), (1,0), colspan=2)
ax3 = plt.subplot2grid((3,3), (1, 2), rowspan=2)
ax4 = plt.subplot2grid((3,3), (2, 0))
ax5 = plt.subplot2grid((3,3), (2, 1))
plt.show()

したがって、:

different sizes for each plot in gridspec

最初に示したリンクには、他のものの中でも特にラベルを削除する例があります。

14
armatita