2012-05-10 48 views
6

可能重複:
Add separate colors for two (or more) specific values in color plot and color bar設置任意顏色的僞情節與matplotlib

我有值的數組,我想這些陰謀使用令pColor在matplotlib。我使用的顏色映射'YlOrRd',它工作正常 - 但我想使用顏色映射除零以外的所有值。也就是說,所有的值都不是0,應該使用顏色映射 - 我想0爲黑色。

目前我正在使用,爲我的數組'n'的numpy數組。

pcolor(x,cmap=cm.YlOrRd) 

是有辦法任意固定在數組x是0至黑色的所有值?

謝謝, 戴夫。

回答

5

這裏有兩種方法可以做到這一點。一個是通過創建自己的colormap,另一個通過使用masked array。說我們有:

import matplotlib 
from pylab import * 

data = np.arange(-50, 50).reshape(10, 10) 
data = np.abs(data) 
pcolor(data, cmap=cm.YlOrRd) 
show() 

這將產生: enter image description here 現在我們做同樣的事情,而是創建一個名爲colors具有相同的值cm.YlOrRd,除了0項,這是我們設置爲黑色(名單0,0,0 in rgb)。然後我們使用LinearSegmentedColormap.from_list實際上使顏色表:

import matplotlib 
from pylab import * 

data = np.arange(-50, 50).reshape(10, 10) 
data = np.abs(data) 
colors = [(0,0,0)] + [(cm.YlOrRd(i)) for i in xrange(1,256)] 
new_map = matplotlib.colors.LinearSegmentedColormap.from_list('new_map', colors, N=256) 
pcolor(data, cmap=new_map) 
savefig('map.png') 
show() 

這會產生同樣的情節,但零個值是黑色:

enter image description here 下面是使用屏蔽陣列,它有點更復雜的其他方式,代碼中的註釋說明步驟:

from pylab import * 
import numpy.ma as ma 

data=np.arange(-50,50).reshape(10,10) 
data=np.abs(data) 
#create a mask where only values=0 are true: 
mask = data == 0 
#create a masked array by combining our mask and data: 
mx = ma.masked_array(data, mask) 
#set masked values in cm.YlOrRd to 'black' 
cm.YlOrRd.set_bad(color='black', alpha=None) 
# pcolor(data,cmap=cm.YlOrRd) 
#we must use pcolormesh instead of pcolor, as pcolor does not draw masked values at all 
pcolormesh(mx,cmap=cm.YlOrRd) 
show() 

這產生了與上面相同的圖。

這些方法之間存在潛在的差異,第一種方法將舍入數據值並應用適當的顏色,而第二種方法將只將值設置爲0到黑色(即0.001將不會被掩蓋,所以將是適當的cm.YlOrRd顏色)。第二個的主要優點是你可以完全隨意地屏蔽掉條目。