2016-09-27 86 views
0

我正在通過.imshow()方法在2D中交互式顯示3d數據。我讓用戶在查看單個二維圖層和查看所有二維圖層的總和之間更改模式。這導致顯示值的範圍發生很大變化。由於這個原因,始終保持相同的顏色映射會導致圖像過飽和並且無法讀取。我使用AxesImage類的.set_data()方法來更改顯示的數據,我需要一種同時重新計算顏色映射的方法。我到這個目標最接近的是這樣的功能:set_data之後在matplotlib中動態重新規格化

def blit_data(self, data): 
    c_norm = cs.Normalize(vmin=np.nanmin(data), vmax=np.nanmax(data)) 
    cmap = plt.get_cmap('viridis') 
    scalar_map = cmx.ScalarMappable(norm=c_norm, cmap=cmap) 
    cmapped = scalar_map.to_rgba(data) 
    self.display.set_data(cmapped) 

(cmx = matplotlib.cm, cs = matplotlib.colors, plt = matplotlib.pyplot) 

然而,這具有不必要的副作用:鼠標懸停的像素在顯示圖像中現在顯示[RGB]元組作爲工具提示,而不是原始float64值,這妨礙了對這些數據的探索。出於這個原因,我正在尋找另一種方法來達到同樣的效果。後續問題將是如何將這種重新規範化傳達給一個顏色條,因此它保持相關性。

+0

'cm.set_clim'不起作用? – tacaswell

+0

我不這麼認爲,'cm'模塊沒有'set_clim' metod,即使它可能是全局的。你的意思是'matplotlib.cm.ScalarMappable'的'set_clim'方法嗎?如果是的話,這將如何適用於這裏?在我發佈的代碼中,我已經使用了ScalarMappable的一個實例,並且它在mouseover上引入了這個問題[r g b a]。 或者,也許我只是沒有找到你的意思'set_clim',老實說,文檔有點混亂。 – Jatentaki

+0

對不起,我認爲你的代碼中的cm是一個標量可映射的。你的self.display是一個標量mappale實例,使用它的set_clim – tacaswell

回答

0
import matplotlib.pyplot as plt 
import numpy as np 

fig, (ax1, ax2) = plt.subplots(1, 2) 

data = np.random.rand(10, 10) 

im1 = ax1.imshow(data, interpolation='none', cmap='viridis') 
im2 = ax2.imshow(data, interpolation='none', cmap='viridis') 
im2.set_clim(0, .5) 

example output