colormap又叫colorbar是一个包含三列矩阵的色彩映射表,简单来说就是一个shape为(N,3)的矩阵。
矩阵中的值的值取值范围为[0,1]
每一行代表一个颜色,即RGB值
1.matplotlib colorbar
(a)matplotlib自带的colorbar
python的matplotlib模块中内嵌了大批常用的colormapshttps://matplotlib.org/examples/color/colormaps_reference.html
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as mp
import numpy as np
import netCDF4 as nc
#%%
obj=nc.Dataset('E:/tidal mixing/gebco/GEBCO_2014_2D_90.0_5.0_100.0_17.0.nc')
lon=obj.variables['lon'][0:-1:2]
lat=obj.variables['lat'][0:-1:2]
elevation=obj.variables['elevation'][0:-1:2,0:-1:2]
elevation=np.ma.masked_greater_equal(elevation,0)
plt.figure(1,figsize=(8,6))
m=mp(llcrnrlon=90.0,llcrnrlat=5.0,urcrnrlon=100.0,urcrnrlat=17.0,\
resolution='i',projection='mill')
m.drawcoastlines()
lonlabel=['90','92','94','96','98','100']
lon_num=[90,92,94,96,98,100]
latlabel=['6','8','10','12','14','16']
lat_num=[6,8,10,12,14,16]
lon_num,temp=m(lon_num,np.arange(len(lon_num)))
temp,lat_num=m(np.arange(len(lat_num)),lat_num)
plt.xticks(lon_num,lonlabel,fontsize=20)
plt.yticks(lat_num,latlabel,fontsize=20)
plt.xlabel('Longitude(E)',fontsize=20)
plt.ylabel('Latitude(N)',fontsize=20)
xx,yy=np.meshgrid(lon,lat)
xx,yy=m(xx,yy)
cmap_color=plt.cm.get_cmap('RdYlBu_r') #_r的意思是反转colorbar
m.pcolormesh(xx,yy,elevation,cmap=cmap_color)
cbar=m.colorbar()
cbar.ax.tick_params(labelsize=20)
2.使用ncl的colorbar
是之前在气象家园上看到的一个大神自己写的包cmaps,这个包中基本包含了ncl的所有colorbar。气象家园地址 ncl colormap:http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml 使用方法很简单,首先导入cmaps包,然后改变cmap就行
import cmaps
cmap_color=cmaps.ncl_default #如需反转colorbar,其方法cmap_color=cmap_color.reversed()
3. 使用气象家园调色盘
这种方法是结合气象家园的调色盘,将平时看文献看到的colorbar为自己所用。
气象家园调色盘下载地址:
用链接里的方法克隆完色标之后生成一个txt文件,其文件中包含rgb值,即你将要使用的colormap
之后的工作是在python中导入这个colormap,由于生成的值在[0,255]之间,而python中要用的colormap RGB值范围是[0,1],所以要进行简单转换。
以下将colorbar转换写成一个函数,直接调用即可。
这个函数需要用到matplotlib的colors,因此要提前导入
from matplotlib import colors
def dcmap():
file_path='E:/python/colorbar/test.txt'
fid=open(file_path)
data=fid.readlines()
n=len(data);
rgb=np.zeros((n,3))
for i in np.arange(n):
rgb[i][0]=data[i].split(',')[0]
rgb[i][1]=data[i].split(',')[1]
rgb[i][2]=data[i].split(',')[2]
rgb=rgb/255.0
icmap=colors.ListedColormap(rgb,name='my_color')
return icmap
` cmap_color=dcmap()
m.pcolormesh(xx,yy,elevation,cmap=cmap_color.reversed())`
以上三点是我常用的三种选择python colorbar的方法,还有一种方法是可以用matplotlib自己定义新的colorbar以及在原有colorbar的基础上修改形成一个新的colorbar的方法