首页 > 解决方案 > 如何将多个 imshow() 结果放在一个图中?

问题描述

我想在一个图中绘制矩阵的所有迭代syn0,但是下面的代码只显示最后一次迭代,如果我更改代码,它将打开绘图 60000 次,我怎样才能在一个图中绘制所有迭代阴谋?

syn0 = 2 * np.random.random((3, 4)) - 1

arr_syn0[0][0].append(syn0[0][0])
arr_syn0[0][1].append(syn0[0][1])
arr_syn0[0][2].append(syn0[0][2])
arr_syn0[0][3].append(syn0[0][3])
arr_syn0[1][0].append(syn0[1][0])
arr_syn0[1][1].append(syn0[1][1])
arr_syn0[1][2].append(syn0[1][2])
arr_syn0[1][3].append(syn0[1][3])
arr_syn0[2][0].append(syn0[2][0])
arr_syn0[2][1].append(syn0[2][1])
arr_syn0[2][2].append(syn0[2][2])
arr_syn0[2][3].append(syn0[2][3])


plt.figure()
x=plt.imshow(syn0,aspect='auto', interpolation="nearest", cmap='YlOrRd_r', origin="upper")
plt.colorbar(x)
plt.title('syn1')
plt.show()

标签: pythonmatplotlib

解决方案


您说您想在一个图中绘制所有迭代,但由于您要迭代超过 60000 张图像,我猜您想要的是在同一个图上绘制新数据而不打开新数据。

为此,您应该imshow仅在第一张图像上使用该draw方法,并在其他图像上使用该方法,然后是pause调用 GUI 事件循环并更新图像的方法。

试图将您的代码减少到最小、完整和可验证的示例,我会做这样的事情:

import numpy as np
import matplotlib.pyplot as plt

firstImage = True

for j in range(5): 
    syn0 = 2 * np.random.random((3, 4)) - 1
    if firstImage:    
        img=plt.imshow(syn0,aspect='auto', interpolation="nearest", cmap='YlOrRd_r', origin="upper") 
        firstImage = False
    else:
        img.set_data(syn0)
        plt.pause(0.1)
        plt.draw()
    plt.title('syn1') 

此代码一个接一个地显示同一图形上的不同图像。希望这可以帮助。


推荐阅读