Matplotlib - 10 x 10矩阵仅填充最后一个实例

问题描述 投票:0回答:1

我试图在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()
numpy matplotlib plot
1个回答
0
投票

如果你调用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(...)

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.