Как сделать на фигуре более 10 подсюжетов?

Я пытаюсь создать сетку подсюжетов 5x4, и, глядя на примеры, мне кажется, что лучший способ:

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

где первые два числа на подзаголовке (22) указывают, что это сетка 2x2, а третье число указывает, какой из 4 вы делаете. Однако, когда я попробовал это, мне пришлось подняться до:

plt.subplot(5420)

и я получил ошибку:

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

Значит ли это, что вы не можете сделать больше 10 подсюжетов, или есть способ обойти это, или я неправильно понимаю, как это работает?

Заранее спасибо.


person Sam V    schedule 24.05.2016    source источник
comment
Используйте запятые: plt.subplot(5,4,20). Вы можете найти ссылку на это поведение в документации.   -  person wflynny    schedule 25.05.2016
comment
Также актуально (хотя вопрос низкого качества): stackoverflow.com/questions/35510155/matplotlib-subplot   -  person wflynny    schedule 25.05.2016


Ответы (1)


Вероятно, вы ищете 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

Если вы создаете вложенные циклы, чтобы получить полную сетку:

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()

, вы получите это:

полная сетка 5x4 в 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()

, в результате чего:

несколько диаграмм рассеяния в сетке

Обратите внимание, что вы можете указать разные размеры для графиков (с указанием количества столбцов и строк для каждого графика):

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()

, следовательно:

разные размеры для каждого участка в сетке

В ссылке, которую я дал в начале, вы также найдете примеры удаления ярлыков среди прочего.

person armatita    schedule 25.05.2016
comment
Почему вы включаете plot = []? Какая польза в этом случае? - person AleB; 01.05.2020