强基初中数学&学Python——第285课 数字和数学第三方模块Matplotlib之九:颜色-选择颜色映射(2)

发散型(Diverging  对于发散型映射,我们希望其L*值单调递增至最大值,这个最大值应接近L*=100,然后是单调递减L*值。我们在颜色映射的两端寻找近似相等的最小值。通过这些措施,BrBG和RdBu是不错的选择。coolwarn也是一个不错的选择,但它不会跨越大范围的(L*)值(请参阅下面的灰度部分)。

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltfrom colorspacious import cspace_converter
cmaps = {}
gradient = np.linspace(0, 1, 256)gradient = np.vstack((gradient, gradient))

def plot_color_gradients(category, cmap_list):    # Create figure and adjust figure height to number of colormaps    nrows = len(cmap_list)    figh = 0.35 + 0.15 + (nrows + (nrows - 1) * 0.1) * 0.22    fig, axs = plt.subplots(nrows=nrows + 1, figsize=(6.4, figh))    fig.subplots_adjust(top=1 - 0.35 / figh, bottom=0.15 / figh,                        left=0.2, right=0.99)    axs[0].set_title(f'{category} colormaps', fontsize=14)
    for ax, name in zip(axs, cmap_list):        ax.imshow(gradient, aspect='auto', cmap=mpl.colormaps[name])        ax.text(-0.01, 0.5, name, va='center', ha='right', fontsize=10,                transform=ax.transAxes)
    # Turn off *all* ticks & spines, not just the ones with colormaps.    for ax in axs:        ax.set_axis_off()
    # Save colormap list for later.    cmaps[category] = cmap_list        #show    plt.show()
plot_color_gradients('Diverging',                     ['PiYG', 'PRGn', 'BrBG', 'PuOr', 'RdGy', 'RdBu', 'RdYlBu',                      'RdYlGn', 'Spectral', 'coolwarm', 'bwr', 'seismic'])                                            

 

循环型(Cyclic)  对于循环型映射,我们希望开始和结束的颜色相同,并以中间为中心对称。(L*)应该从开始到中间单调变化,从中间到结束反向变化。它的增加和减少的两侧对称,并且只有色调(hue)上不同。在两端和中间,(L*)的变化方向相反,应该在(L*)维度中对其进行平滑,以减少伪影。有关循环型映射设计的更多信息,请参见[kovesi-colormaps]。  经常使用的HSV颜色映射也包含在这组颜色映射中,尽管它不是相对于中心点(中间)对称的。此外,(L*)值在整个颜色映射中变化很大,它表示的数据变化不易于被查看者感知,因此在展示数据上并不是个好的选择。请参阅〔mycarta-jet〕上对此想法(idea)的扩展。

· 

plot_color_gradients('Cyclic', ['twilight', 'twilight_shifted', 'hsv'])

 

定性型(Qualitative)  定性映射并不旨在展示数据,查看亮度参数时可以验证这一点。(L*)值在整个映射中随处变化的,显然不是单调增加的。所以不是展示数据变化的好选择。

· 

· 

· 

· 

plot_color_gradients('Qualitative',                     ['Pastel1', 'Pastel2', 'Paired', 'Accent', 'Dark2',                      'Set1', 'Set2', 'Set3', 'tab10', 'tab20', 'tab20b',                      'tab20c'])

 

混杂型(Miscellaneous)  一些混杂型颜色映射是为特殊的用途而设立的。例如下图中,地球概览(gist_earth)、海洋(ocean)和地形(terrain)似乎都是为了将地形(绿色/棕色)和水深(蓝色)绘制在一起而创建的。那么,我们希望在这些颜色映射中看到差异(divergence),但多个扭结(kinks)可能并不理想,诸如在gist_earth和terrain中。创建CMRmap是为了很好地转换为灰度,尽管它在(L*)中似乎有一些小扭结。cubehelix在亮度和色调上的变化都平滑,但在绿色色调区域似乎有一个小凸起。turbo是用来显示深度和视差数据的。  经常使用的喷射(jet)颜色映射包含在这组颜色映射中。我们可以看到(下图),(L*)值在整个颜色映射中变化很大,这也使它表示的数据不易被观看者感知,因此在展示数据时,它也是个糟糕的选择。请参阅〔mycarta-jet〕和〔turbo〕上关于这一想法的扩展。

· 

· 

· 

· 

· 

plot_color_gradients('Miscellaneous',                     ['flag', 'prism', 'ocean', 'gist_earth', 'terrain',                      'gist_stern', 'gnuplot', 'gnuplot2', 'CMRmap',                      'cubehelix', 'brg', 'gist_rainbow', 'rainbow', 'jet',                      'turbo', 'nipy_spectral', 'gist_ncar'])

 

kovesi-colormaps:

https://matplotlib.org/stable/tutorials/colors/colormaps.html#kovesi-colormaps

mycarta-jet:

https://matplotlib.org/stable/tutorials/colors/colormaps.html#mycarta-jet

turbo:

https://matplotlib.org/stable/tutorials/colors/colormaps.html#turbo