2016-12-27 90 views
2

我尝试在不同的子图中绘制图像,但由于某些原因图像的轴在绘图时发生了变化。为了证明这一点,在下面的例子中,我绘制图像在副区的4×2的网格,并予保持检查第一图像的轴线是否保持不变:为什么matplotlib.pyploy.imshow会改变它的轴?

import matplotlib.pyplot as plt 
import numpy as np 
_,ax = plt.subplots(4,2) 
ims = [[None]*2]*4 
for i in range(4): 
    for j in range(2): 
     plt.sca(ax[i][j]) 
     ims[i][j] = plt.imshow(np.random.rand(10,10)) 
     print(ims[0][0].axes is ax[0][0]) 

输出表明后第三图像绘制,所述第一图像的轴线改变:

True 
True 
False 
False 
False 
False 
False 
False 

此外,这被证明是正确的:

ims[0][0].axes is ax[3][0] 

输出:

True 

这个困扰我的原因是我想更新使用IMS [0] [0] .set_data()在未来步骤的图像,但是当我尝试这样做,他们只在轴更新ax[3][0]

行为如何解释,我该如何解决它?

回答

2

这是一种解决方法。您可以创建一个列表并将您的AxesImage对象附加到该列表。这按预期工作。

import matplotlib.pyplot as plt 
import numpy as np 
_,ax = plt.subplots(4,2) 
ims2=[] 

for i in range(4): 
    for j in range(2): 
     im = ax[i][j].imshow(np.zeros(shape=(10,10)), vmin=0, vmax = 1) 
     ims2.append(im) 
     print(ims2[0].axes is ax[0][0]) 

for i in range(4): 
    for j in range(2): 
     ims2[i*2+j].set_data(np.random.rand(10,10)) 

plt.show() 

我不能很好地说明问题,但与Python列表做。
在这里,你正在使用

ims = [[None]*2]*4 

这是不一样的

ims = [ [ None for j in range(2)] for i in range(4)] 

虽然这两个命令打印相同的列表。 使用第二种方法也适用于你。

+1

我问了一个关于列表创建差异的确切原因的新问题:http://stackoverflow.com/questions/41344862/difference-in-creating-list-of-lists-in-python – ImportanceOfBeingErnest

相关问题