2014-02-20 68 views
0

所以在右邊我有1000個矩陣的特徵值譜散佈在彼此之上。在左邊,我想得到一個直方圖或密度函數,以便發生特徵值的位置和頻率。numpy的histogram2d和colormaps的問題

Two Panel Eigenvalue Distribution Plot

直方圖與numpy的完成:

bins = 200 
d = max(max(re), max(im), -min(re), -min(im)) 
histogram2D, binsX, binsY = np.histogram2d(re, im, bins=bins, range=((-d,d),(-d,d))) 
histogram2D = histogram2D.T 

此外,以特徵值在每個箱量,我想直方圖仍然清楚地顯示在那裏發生的特徵值,並在那裏他們沒有。所以我做了我自己的顏色表:

def redblue_zeta(Zmin, Zmax, zeta=0.0): 
    breakingpoint = float(Zmin)+float(zeta)/(float(Zmax)-float(Zmin)) 
    cdict = {'red': ((0.0, 1.0, 1.0), (breakingpoint, 1.0, 0.0), (1.0, 1.0, 1.0)), 
      'green': ((0.0, 1.0, 1.0), (breakingpoint, 1.0, 0.0), (1.0, 0.0, 0.0)), 
      'blue': ((0.0, 1.0, 1.0), (breakingpoint, 1.0, 1.0), (1.0, 0.0, 0.0))} 
    return(cdict) 

(這是一個比較複雜一點,因爲我使用的其他地塊的地圖,澤塔> 0藏漢)然後我畫在:

Zmax = histogram2D.max() 
cdict=cc.redblue_zeta(0,Zmax,zeta=0.0) 
plt.register_cmap(name='rb', data=cdict) 

plt.imshow(histogram2D, cmap=cm.get_cmap('rb'), extent=[-d, d, -d, d], interpolation='nearest') 

所以一如果在該二維圖中存在恰好爲零的特徵值,則該二維圖中的點應該是白色的。否則,它應該是藍色和紅色之間的任何東西。但那不是我得到的。似乎直方圖或色圖將小值舍入爲零,因爲我在直方圖中得到了太小的藍色區域。有任何想法嗎?謝謝。

回答

0

是否有一個原因,你需要自己的顏色映射,而不是一個內置的縮放版本?如果沒有,然後移動到一個內置的顏色圖,看看你是否能以這種方式工作。你可以隨時調整顏色。

如果你確實需要你自己的,那麼我懷疑colormap工作不正常。你能否修改register_cmap來首先創建LinearSegmentedColor地圖,然後註冊該地圖? http://matplotlib.org/api/colors_api.html#matplotlib.colors.LinearSegmentedColormap

您是否嘗試過僅憑自己的地圖顯示地圖?其次,爲了跟隨文檔,我將cdict的定義從一個元組元組字典切換到元組列表字典。