数据映射以及colorbar的设置
气象海洋数据在实际应用中,常常需要不等间距的colorbar设置以及显示,本文提供了matlab以及python的数据映射和colorbar设置方法,供参考使用
MatLab版本
% --- 源数据的映射
level = [0,0.1,10,25,50,100,200,250] ;
xx1=level(1:end-1);
xx2=level(2:end);
CC1=0;CC2=length(xx1);
F=WK;
for jj=1:length(xx1)
F(WK>=xx1(jj)&WK<xx2(jj))=jj - 0.5;
end
% --- colorbar的设置
h=mypcolor(lon(1:2:end),lat(1:2:end),(F.*mask)'); hold on
shading flat
colormap(cmap);
caxis([0 length(level)-1]);
cbar=colorbar('h');
set(cbar,'Ticks',0:length(level)-1,'TickLabels',level) ;
Matlab作图示例
Python版本
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.ticker as ticker
from matplotlib.colors import LinearSegmentedColormap
import scipy.io as sio
def Plot_PRE_Compare24(data, mask,
lon=np.arange(114.745, 122.745, 0.01),
lat=np.arange(34.295, 38.455, 0.01),
cmaps=None, shp_path=None, title=None,
**kwargs):
# ---- data preprocessing ---> mapping
data = data * mask
WK = data
level = np.array([0, 0.1, 10, 25, 50, 100, 200, 250])
xx1 = level[0:-1]
xx2 = level[1:]
CC1 = 0
CC2 = len(xx1)
for jj in range(CC2):
data[np.where((WK >= xx1[jj]) & (WK < xx2[jj]))] = jj
# --- colormap
if not cmaps:
colorslist = np.array(
[[255., 255., 255.], [165., 243., 141.], [57., 170., 0.], [99., 186., 255.], [0., 0., 254.],
[254, 217, 0], [255., 0., 254.]]) / 255
cmaps = LinearSegmentedColormap.from_list('mylist', colorslist, N=7)
else:
cmaps = LinearSegmentedColormap.from_list('mylist', cmaps, N=7)
# --- plotmap
map = Basemap(llcrnrlon=lon[0], llcrnrlat=lat[0], urcrnrlon=lon[-1], urcrnrlat=lat[-1])
# map = Basemap(llcrnrlon=114, llcrnrlat=34, urcrnrlon=122, urcrnrlat=38)
if shp_path:
map.readshapefile(shp_path, 'shapes', drawbounds=True)
"""显示网格线"""
plt.xticks([116, 118, 120, 122], fontsize=6)
plt.yticks([35, 36, 37, 38], fontsize=6)
map.pcolor(lon, lat, (data * mask).T, cmap=cmaps, vmin=0, vmax=7) # vmin=0, vmax=7
font = {#'family': 'SimHei',
'weight': 'normal',
'size': 8,}
bar = map.colorbar(location='right', label='PRE [mm/24h]')
bar.set_label('PRE [mm/24h]', fontdict=font)
bar.ax.tick_params(labelsize=8)
tick_locs = [0, 1, 2, 3, 4, 5, 6, 7]
tick_labels = ['0', '0.1', '10', '25', '50', '100', '200', '250']
bar.locator = ticker.FixedLocator(tick_locs)
bar.formatter = ticker.FixedFormatter(tick_labels)
bar.update_ticks()
if title:
fontd = {'fontsize': 8,
'fontweight': 'bold',
'color': 'red'}
plt.title(title, fontdict=fontd, loc='left')
Python作图示例