为什么matplotlib.pyploy.imshow改变它的轴?

时间:2016-12-27 09:28:40

标签: python matplotlib

我尝试在不同的子图中绘制图像,但由于某种原因,图像的轴在绘图时会发生变化。为了证明这一点,在下面的例子中,我用4乘2的子图网格绘制图像,并且我一直在检查第一个图像的轴是否保持不变:

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]中更新

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

1 个答案:

答案 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)]

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