本帖主要就介紹一下matplotlib中自定義colormap的一些命令砂吞,以及制作colormap的一些方法悔常。
1) matplotlib.Colors.LinearSegmentedColormap (name,segmentdata,N=256,gamma=1.0)
colormap對(duì)象以線性分割的數(shù)據(jù)列表為基礎(chǔ)滨巴,數(shù)據(jù)列表是由原色三元組進(jìn)行線性插值產(chǎn)生优烧,為[0 1]之間的值沛豌。
其中segmentdata是一個(gè)由red,blue,green詞條構(gòu)成的詞典夭咬,每一個(gè)詞條都由 x,y0,y1三個(gè)值構(gòu)成啃炸,參數(shù)alpha為可選項(xiàng)。詞條中的三個(gè)值的含義為:x 表示在colorbar中的位置卓舵,即colorbar的長(zhǎng)度為1南用,因此 x 的值在[0 1]之間,且只能單調(diào)變化; y0,y1為表示顏色的值边器,通常為相同的值训枢,如果取值不同時(shí),對(duì)colormap的變化更有幫助忘巧。y0表示為 x 左邊的顏色值恒界,y1表示為 x 右邊的顏色值。
下面舉個(gè)例子:
cdict = {'red': [(0.0, 0.0, 0.0),
(0.5, 1.0, 1.0),
(1.0, 1.0, 1.0)],
'green': [(0.0, 0.0, 0.0),
(0.25, 0.0, 0.0),
(0.75, 1.0, 1.0),
(1.0, 1.0, 1.0)],
'blue': [(0.0, 0.0, 0.0),
(0.5, 0.0, 0.0),
(1.0, 1.0, 1.0)]}
上述詞典中 red 數(shù)據(jù)表示把colorbar中red分為兩部分砚嘴,[0 0.5]和[0.5 1]十酣,綠色分為三部分涩拙,即在[0 0.25]之間green為0,[0.25,0.75]之間
green為1,[0.75,1]之間green為1,藍(lán)色同理耸采。
gamma值用于調(diào)節(jié)colormap底部和頂部的亮度兴泥。
因?yàn)槊恳欢蔚念伾际窃趛0和y1之間進(jìn)行插值所得,因此第一行的y0和最后一行的y1是不會(huì)用到的虾宇。
2) matplotlib.colors.ListedColormap(colors,name='from_list',N=None)
3) matplotlib.cm.get_cmap(name=None,lut=None)
- matplotlib.cm.register_cmap(name=None,cmap=None,data=None,lut=NOne)
以上幾個(gè)命令不再一一贅述搓彻,更詳細(xì)的信息可以點(diǎn)我
以下是一些創(chuàng)建colormap的方法:
1) 使用LinearSegmentedColormap命令
import matplotlib.colors as col
cdict = {'red': ((0.0, 0.0, 0.0),
(0.3, 0.5, 0.5),
(0.6, 0.7, 0.7),
(0.9, 0.8, 0.8),
(1.0, 0.8, 0.8)),
'green': ((0.0, 0.0, 0.0),
(0.3, 0.8, 0.8),
(0.6, 0.7, 0.7),
(0.9, 0.0, 0.0),
(1.0, 0.7, 0.7)),
'blue': ((0.0, 1.0, 1.0),
(0.3, 1.0, 1.0),
(0.6, 0.0, 0.0),
(0.9, 0.0, 0.0),
(1.0, 1.0, 1.0))}
cmap1 = col.LinearSegmentedColormap('my_colormap',cdict,N=256,gamma=0.75)
# my_colormap可以自定義,如果沒有cmap1嘱朽,下面的cmap1可以換位my_colormap旭贬,但是為字符串格式
# gamma項(xiàng) 一般可以省略
cm.register_cmap(name='own1', cmap=cmap1) # 進(jìn)行‘注冊(cè)’,使get_cmap命令能檢索到該cmap
<span id="kM0.04844997560317399">2) 使用from_list方法
</span><div class="blockcode"><blockquote>import matplotlib.colors as col
startcolor = '#586323'
midcolor = '#fcffc9'
endcolor = '#bd2309'
cmap2 = col.LinearSegmentedColormap.from_list('own2',[startcolor,midcolor,endcolor])
cm.register_cmap(cmap=cmap2)
2) 使用ListedColormap命令
import matplotlib.colors as col
cpool = [ '#bd2309', '#bbb12d', '#1480fa', '#14fa2f', '#000000',
'#faf214', '#2edfea', '#ea2ec4', '#ea2e40', '#cdcdcd',
'#577a4d', '#2e46c0', '#f59422', '#219774', '#8086d9' ]
cmap3 = col.ListedColormap(cpool[0:10], 'indexed')
# 注意:cpool中有15個(gè)顏色搪泳,但是只使用了10個(gè)稀轨,其余的會(huì)被忽略
# 具體可查閱matplotlib官方文檔中對(duì)ListedColormap的說明
cm.register_cmap(cmap=cmap3)
import netCDF4 as nc
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
filepath = '/run/media/root/*WRF/-5/s/wrfout_d02_2014-09-28_12_00_00'
data = nc.Dataset(filepath,'r')
var = 'REFL_10CM'
dbz = data.variables[var][:]
dbzsize = np.shape(data.variables[var])
timelen = dbzsize[0]
heightlen = dbzsize[1]
latlen = dbzsize[2]
lonlen = dbzsize[3]
print(dbzsize)
lats = 30; late = 35;
lons = 114; lone = 120;
m = Basemap(projection='cyl',llcrnrlat=lats,urcrnrlat=late,llcrnrlon=lons,urcrnrlon=lone,resolution='i')
m.drawparallels(np.arange(lats,late+1,1.),labels = [1,0,0,0],fontsize=15,linewidth = 0. )
# set linewidth = 0 to turn off longitude and latitude dash line
m.drawmeridians(np.arange(lons,lone+2,2.),labels = [0,0,0,1],fontsize=15,linewidth = 0.)
m.drawcoastlines()
m.drawcountries()
#m.drawlsmask()
lon,lat = m.makegrid(lonlen,latlen)
print(np.shape(lon))
x,y = m(lon,lat)
clevs = np.arange(0,70,10)
cdict = {'red' : [(0.,0,1),
(0.15,1.,1.),
(0.3,0.85,0.85),
(0.45,0.7,0.7),
(0.6,0.55,0.55),
(0.75,0.4,0.4),
(0.9,0,1),
(1.,1.,0.)],
'green' : [(0.,0,1),
(0.15,1.,1.),
(0.3,0.85,0.85),
(0.45,0.7,0.7),
(0.6,0.55,0.55),
(0.75,0.4,0.4),
(0.9,1.,1.),
(1.,1.,1.)],
'blue' : [(0.,0,1),
(0.15,1.,1.),
(0.3,0.85,0.85),
(0.45,0.7,0.7),
(0.6,0.55,0.55),
(0.75,0.4,0.4),
(0.9,1,1.),
(1.,1.,1.)]}
my_cmap = colors.LinearSegmentedColormap(name='dbzcmap',segmentdata = cdict,N=256)
#cm.register_cmap(name = 'dbzcmap',data = cdict,lut = 128)
# 如果把上述語(yǔ)句取消注釋,把LinearSegmentedColormap語(yǔ)句行注釋掉岸军,也可定義colormap
# 但是下面語(yǔ)句中的cmap=my_cmap應(yīng)改為 cmap = 'dbzcmap'
ref = m.contourf(lon,lat,dbz[29,29,:,:],clevs,alpha = 1,cmap= my_cmap)#plt.cm.Greys)
# alpha 表示透明度
cbar = m.colorbar(ref)
cbar.set_label('dBZ')
axes = plt.gca()
plt.grid(False)
plt.title('Reflectivity plot for WRF_ARW',size = 20)
plt.savefig('dbz')
plt.show()