2017-09-25 109 views
1

我有以下代碼Pyplot Imshow自動縮放切出不規則的NaN填充

import matplotlib.pyplot as plt 
import numpy as np 

array = np.pad(np.random.rand(300,300),10,'constant', constant_values = nan) 

fig, ax = plt.subplots() 
l = ax.imshow(array, origin = 'lower') 

plt.show() 

正如你所看到的,它繪製的圖像與NaN的周圍邊緣的邊框。有沒有辦法讓Imshow自動裁剪或自動縮放到沒有NaN的情節區域?

有幾點注意事項。

  • 填充是不平等的:在這個例子中,填充是各方平等的,但這不是我的真實數據的真實,所以它不能只是假設每一面相同墊。

  • 不能物理編輯陣列:真正的數據實際上是一個天文FITS文件與WCS座標數據,因此使用WCSAxesSubplot系統,具有plt.fig.add_subplot(projection = wcs)命令,以及從astropy FITS頭文件,但沒有辦法很好地包括在我的示例代碼中。 (也就是說,我相信如果有人能夠在普通的pyplot/matplotlib/imshow中告訴我如何做到這一點,我可以通過某種方式將其轉移)。真正的問題是,我無法編輯原始數據數組以刪除NaN因爲我的頭文件(即參考像素)將是不正確的,我的座標將關閉。

  • NaN可能不與圖像邊緣對齊:未來的數據集可能會稍微旋轉,甚至在圖像位之間有NaN字段。所以我不能把它切掉我的圖像的角落或部分,以便很好地適應其他位。縮放後,某些NaN可能仍然需要可見。 (現在這個問題不大,因爲我目前的數據集都有很好的,直線的,並行的邊緣)。

任何幫助你可以提供將不勝感激。我很樂意提供額外的信息。另外,一旦自動實現了縮放,如果有人可以指示我如何從圖像中獲取當前縮放,那就太好了(因爲它解決了一個無關的問題)。

回答

0

這應該工作:

mask = ~np.isnan(array) 
x = np.flatnonzero(np.any(mask, axis = 0)) 
x = np.arange(x.min(), x.max() + 1)[:, None] 
y = np.flatnonzero(np.any(mask, axis = 1)) 
y = np.arange(y.min(), y.max() + 1) 

plt.imshow(array[x,y], origin = 'lower') 

基本上只是建立的行和列的索引看中與任何非nan值。

+0

儘管它可以切出nans,但我的WCS座標現在指向不正確的像素,這會拋出我的座標軸。我害怕我不能使用這個:( –

+0

希望我知道這意味着什麼,所以我可以幫你。 –