我试图在10x10矩阵中绘制来自notMNIST数据集的100个随机图像,但是只有最后一个子图才返回图像。图像数据存储在x中,标签存储在y中。
import matplotlib.pyplot as plt
%matplotlib inline
num_subplots = 10
fig, ax = plt.subplots(nrows=num_subplots, ncols=num_subplots, figsize=(10, 6))
for idx in range(10):
n = np.random.randint(np.sum(y < 0), len(y))
imgl = x[n,:].reshape((28,28))
imshow(imgl, cmap = plt.get_cmap('gray'))
plt.show()
如果你调用plt.imshow()
,则该图将始终出现在当前活动的子图中,在您的情况下,该子图是已创建的最后一个子图。相反,您可以使用面向对象的matplotlib语法遍历所有子图并在子图上调用imshow()
。当您生成一个子图阵列时,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(...)
希望这可以帮助。