不幸的是,matplotlib不提供Matlab的功能
demcmap。python
basemap包中实际上可能有一些内置功能,我不知道这些功能。
因此,坚持使用matplotlib板载选项,我们可以子类
Normalize化以围绕色图中间的点为中心构建颜色归一化。可以在有关StackOverflow的另一个问题中找到该技术,并将其适应特定的需求,即设置一个
sealevel(可能最好选择为
0)和
col_val该海平面应对应的颜色图中的值(介于0和1之间)。在地形图的情况下
0.22,与turqoise颜色相对应的似乎是一个不错的选择。
然后,可以将Normalize实例作为参数的给定
imshow。所产生的图形可以在图片的第一行下方看到。
由于海平面周围的平滑过渡,周围的值
0以绿松石色显示,因此很难区分陆地和海洋。
因此,我们可以稍微改变地形图,并剪掉那些颜色,以便更好地看到海岸线。这是通过将地图的两个部分(从0到0.17,从0.25到1)组合在一起,然后切出一部分来完成的。
import numpy as npimport matplotlib.pyplot as pltimport matplotlib.colorsclass 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-colormapscolors_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 colormapcolors = 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 datafig, 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, ax=ax[0,1])norm3 = FixPointNormalize(sealevel=0, vmax=0)im3 = ax[0,2].imshow(data-2400.1, norm=norm3, cmap=plt.cm.terrain)fig.colorbar(im3, ax=ax[0,2])plt.figtext(.5, 0.46, "Using custom cut map and FixedPointNormalize (adding hard edge between land and sea)", ha="center", size=14)norm4 = FixPointNormalize(sealevel=0, vmax=3400)im4 = ax[1,0].imshow(data+1000, norm=norm4, cmap=cut_terrain_map)fig.colorbar(im4, ax=ax[1,0])norm5 = FixPointNormalize(sealevel=0, vmax=3400)im5 = ax[1,1].imshow(data, norm=norm5, cmap=cut_terrain_map)cbar = fig.colorbar(im5, ax=ax[1,1])norm6 = FixPointNormalize(sealevel=0, vmax=0)im6 = ax[1,2].imshow(data-2400.1, norm=norm6, cmap=cut_terrain_map)fig.colorbar(im6, ax=ax[1,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()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)