加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python等效于Matlab的Demcmap(提升/ – 适当的色彩映射)

发布时间:2020-12-20 11:56:08 所属栏目:Python 来源:网络整理
导读:我正在寻找一种方法来获得matplotlib的高程相应色图. cmap“terrain”看起来很棒但是颜色缩放不是基于零(即,如果比例为0- 5000m,则0- 1000m范围可能是蓝色阴影,你可以认为是海底-水平) 例如: Matlab函数等效于: demcmap 让matplotlib在零高程标记周围移动
我正在寻找一种方法来获得matplotlib的高程相应色图.

cmap“terrain”看起来很棒但是颜色缩放不是基于零(即,如果比例为0-> 5000m,则0-> 1000m范围可能是蓝色阴影,你可以认为是海底-水平)

例如:

enter image description here

Matlab函数等效于:
demcmap

让matplotlib在零高程标记周围移动地形色彩图的绿色/棕色和蓝色的最佳方法是什么?

解决方法

不幸的是,matplotlib没有提供Matlab的demcmap的功能.
python底图包中可能实际上有一些内置功能,我不知道.

因此,坚持使用matplotlib板载选项,我们可以继承Normalize以构建以色彩映射中间点为中心的颜色标准化.这种技术可以在another question的StackOverflow上找到并适应特定的需要,即设置一个sealevel(可能最好选择为0)和colormap col_val(范围在0和1之间)的值,这个sealevel应该对应.在地形图的情况下,似乎0.22(对应于turqoise颜色)可能是一个不错的选择.
然后可以将Normalize实例作为imshow的参数给出.可以在图片的第一行中看到结果数字.

由于围绕海平面的平滑过渡,0左右的值出现在turqoise颜色中,使得很难区分陆地和海洋.
因此,我们可以稍微改变地形图并剪切这些颜色,以便更好地看到海岸线.这是在地图的combining two parts处完成的,范围从0到0.17和0.25到1,因此切掉了它的一部分.

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()

enter image description here

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读