我尝试在不同的子图中绘制图像,但由于某种原因,图像的轴在绘图时会发生变化。为了证明这一点,在下面的例子中,我用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]
中更新
如何解释行为,我该如何解决?
答案 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)]
虽然两个命令都打印相同的列表。 使用第二种方法也适合你。