Если вы позвоните plt.imshow()
, график всегда будет отображаться в текущем активном субплоте, который, в вашем случае, является последним субплотом, который был создан.Вместо этого вы можете перебрать все вспомогательные участки и вызвать imshow()
на самих вспомогательных участках, используя объектно-ориентированный синтаксис matplotlib.Когда вы генерируете массив подзаголовков, функция subplots()
возвращает массив 2d numpy
, который сначала необходимо преобразовать в итерацию 1D, чего можно добиться с помощью функции ravel()
.См. Приведенный ниже код для полного примера.
import matplotlib.pyplot as plt
%matplotlib inline
num_subplots = 10
fig, axes = plt.subplots(nrows=num_subplots, ncols=num_subplots, figsize=(10, 6))
for idx,ax in enumerate(axes.ravel()):
n = np.random.randint(np.sum(y < 0), len(y))
imgl = x[n,:].reshape((28,28))
ax.imshow(imgl, cmap = plt.get_cmap('gray'))
plt.show()
Обратите внимание, что я переименовал оригинал с ax
на axes
, чтобы было более очевидно, что у вас есть много вспомогательных участков (экземпляров Axes).Также обратите внимание, что, если вы хотите больше контроля, вы можете циклически проходить по строкам и столбцам вашего подплота.В этом случае вы должны использовать два цикла for
и получать доступ к своим подсюжетам, используя axes[row,col]
, что-то вроде этого:
for row in range(num_subplots):
for col in range(num_subplots):
#some code here
axes[row,col].imshow(...)
Надеюсь, это поможет.