2016-12-27 84 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

相關問題