Python等效于Matlab的Demcmap(提升/ – 适当的色彩映射)
我正在寻找一种方法来获得matplotlib的高程相应色图.
cmap“terrain”看起来很棒但是颜色缩放不是基于零(即,如果比例为0-> 5000m,则0-> 1000m范围可能是蓝色阴影,你可以认为是海底-水平) 例如: Matlab函数等效于: 让matplotlib在零高程标记周围移动地形色彩图的绿色/棕色和蓝色的最佳方法是什么? 解决方法
不幸的是,matplotlib没有提供Matlab的demcmap的功能.
python底图包中可能实际上有一些内置功能,我不知道. 因此,坚持使用matplotlib板载选项,我们可以继承 由于围绕海平面的平滑过渡,0左右的值出现在turqoise颜色中,使得很难区分陆地和海洋. import numpy as np import matplotlib.pyplot as plt import matplotlib.colors class FixPointNormalize(matplotlib.colors.Normalize): """ Inspired by https://stackoverflow.com/questions/20144529/shifted-colorbar-matplotlib Subclassing Normalize to obtain a colormap with a fixpoint somewhere in the middle of the colormap. This may be useful for a `terrain` map,to set the "sea level" to a color in the blue/turquise range. """ def __init__(self,vmin=None,vmax=None,sealevel=0,col_val = 0.21875,clip=False): # sealevel is the fix point of the colormap (in data units) self.sealevel = sealevel # col_val is the color value in the range [0,1] that should represent the sealevel. self.col_val = col_val matplotlib.colors.Normalize.__init__(self,vmin,vmax,clip) def __call__(self,value,clip=None): x,y = [self.vmin,self.sealevel,self.vmax],[0,self.col_val,1] return np.ma.masked_array(np.interp(value,x,y)) # Combine the lower and upper range of the terrain colormap with a gap in the middle # to let the coastline appear more prominently. # inspired by https://stackoverflow.com/questions/31051488/combining-two-matplotlib-colormaps colors_undersea = plt.cm.terrain(np.linspace(0,0.17,56)) colors_land = plt.cm.terrain(np.linspace(0.25,1,200)) # combine them and build a new colormap colors = np.vstack((colors_undersea,colors_land)) cut_terrain_map = matplotlib.colors.LinearSegmentedColormap.from_list('cut_terrain',colors) # invent some data (height in meters relative to sea level) data = np.linspace(-1000,2400,15**2).reshape((15,15)) # plot example data fig,ax = plt.subplots(nrows = 2,ncols=3,figsize=(11,6) ) plt.subplots_adjust(left=0.08,right=0.95,bottom=0.05,top=0.92,hspace = 0.28,wspace = 0.15) plt.figtext(.5,0.95,"Using 'terrain' and FixedPointNormalize",ha="center",size=14) norm = FixPointNormalize(sealevel=0,vmax=3400) im = ax[0,0].imshow(data+1000,norm=norm,cmap=plt.cm.terrain) fig.colorbar(im,ax=ax[0,0]) norm2 = FixPointNormalize(sealevel=0,vmax=3400) im2 = ax[0,1].imshow(data,norm=norm2,cmap=plt.cm.terrain) fig.colorbar(im2,1]) norm3 = FixPointNormalize(sealevel=0,vmax=0) im3 = ax[0,2].imshow(data-2400.1,norm=norm3,cmap=plt.cm.terrain) fig.colorbar(im3,2]) plt.figtext(.5,0.46,"Using custom cut map and FixedPointNormalize (adding hard edge between land and sea)",size=14) norm4 = FixPointNormalize(sealevel=0,vmax=3400) im4 = ax[1,norm=norm4,cmap=cut_terrain_map) fig.colorbar(im4,ax=ax[1,0]) norm5 = FixPointNormalize(sealevel=0,vmax=3400) im5 = ax[1,norm=norm5,cmap=cut_terrain_map) cbar = fig.colorbar(im5,1]) norm6 = FixPointNormalize(sealevel=0,vmax=0) im6 = ax[1,norm=norm6,cmap=cut_terrain_map) fig.colorbar(im6,2]) for i,name in enumerate(["land only","coast line","sea only"]): for j in range(2): ax[j,i].text(0.96,0.96,name,ha="right",va="top",transform=ax[j,i].transAxes,color="w" ) plt.show() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |