2012-05-05 81 views
4

我想在顏色圖中顯示矩陣,並給出兩個或多個特殊值的特定顏色。爲顏色圖和顏色條中的兩個(或多個)特定值添加單獨的顏色

import numpy as np 
from pylab import * 

np.random.seed(10)  
a=np.random.randint(-1,10, size=(5, 5)) 
print a 

fig, ax = plt.subplots() 
mat=ax.matshow(a, cmap=cm.jet, vmin=1, vmax=10) 
colorbar(mat) 
show() 

這裏有a矩陣的值:

[[ 8 3 -1 0 8] 
[-1 0 9 7 8] 
[-1 9 7 5 3] 
[ 2 -1 3 5 7] 
[ 9 0 7 3 0]] 

這裏是劇情: enter image description here
我想黑色所有-1項目和白分配給所有0項,並且我希望它在第一個顏色條上顯示爲兩個不連續的顏色。下面是一個例子,我的照片編輯技巧很差,但應該清楚我想要什麼(顏色條應該是比例尺):
enter image description here 對我來說連續jet彩色地圖並不重要,我會滿足一個解決方案,其中我的色條將是離散的,並且由例如10種顏色構成,其中兩種將是黑色和白色,8種是從jet色圖顏色。然而,重要的是-1和0具有不同的顏色,不管值的總範圍是多少。
例如,如果值範圍爲-1到1000:
enter image description here

回答

8

您可以使用ListedColormap:

import numpy as np 
import matplotlib as mpl 
from matplotlib import pyplot as plt 

N = 10 

np.random.seed(10)  
a=np.random.randint(-1, N, size=(5, 5)) 
print a 

fig, ax = plt.subplots() 

colors = [(0.0,0.0,0.0),(1.0,1.0,1.0)] 
colors.extend(mpl.cm.jet(np.linspace(0, 1, N-1))) 
cmap = mpl.colors.ListedColormap(colors) 
mat=ax.matshow(a, cmap=cmap, vmin=-1, vmax=N-1) 
cax = plt.colorbar(mat, ticks=np.linspace(-0.5, N-1-0.5, N+1)) 
cax.set_ticklabels(range(-1, N)) 
plt.show() 

enter image description here

的數值範圍,我們也可以將值範圍指標第一。

+1

這個代碼會更有用,如果它裏面有任何註釋或解釋,碼。這對我們這些沒有太多經驗的人有幫助。謝謝 – codeKiller

0

在迴應@ newPyUser的評論...

認爲 @ HYRY的奇蹟發生了這樣...

由2個RGB元素的列表,即黑(顏色[0] )和白色(顏色[1]) colors = [(0.0,0.0,0.0),(1.0,1.0,1.0)] 然後追加使用的色彩空間的其餘部分的2項列表的末尾,即從0值到N-1以1 colors.extend(mpl.cm.jet(np.linspace(0, 1, N-1))) 步驟最後構建CMAP定義從-1到N-1 cmap = mpl.colors.ListedColormap(colors) mat=ax.matshow(a, cmap=cmap, vmin=-1, vmax=N-1) 這種方式-1被映射爲黑色(顏色[0])並且0被映射爲白色(顏色[1])