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

  Matplotlib有许多可通过Matplotlib.colormaps访问的内置颜色映射。还有一些外部库提供许多扩展的颜色映射,这可以在Matplotllib文档的第三方颜色映射(Third-party colormaps)部分查看。在这里,我们简要讨论如何在众多选项中进行选择。而有关如何创建自己的颜色映射,请参见在Matplotlib中创建颜色映射(Creating Colormaps in Matplotlib)。

概述

  为了能在3D颜色空间(3D colorspace,用三个变量描述颜色,例如RGB)很好地展示数据集,务必要选择一个好的颜色映射。对于任何给定数据集,最佳的颜色映射取决于许多因素,包括:

  · 表示形式数据还是测量数据([Ware])

  · 对数据集的了解(例如,是否存在偏离其他值的临界值?)

  · 绘图参数中是否有直观的配色方案

  · 观众在该领域是否有标准的期待

  对于许多应用程序,视觉上均匀颜色映射是最佳选择;即其中数据的相等步长被映射为颜色空间中的相等步长的颜色映射。研究人员发现,人类大脑将亮度的变化感知为数量的变化,这比其他的变化(如色调)要好得多。因此,通过单调增加亮度的颜色映射绘制的伪色彩图,能被观看者更好地理解。在第三方颜色映射(Third-party colormaps)部分也可以找到均匀颜色映射的精彩示例。

  颜色有多种的三维表示方案。其中一种方案是CIELAB。在CIELAB方案中,颜色空间的三维分别是:亮度(lightness,L*表示);红到绿(red-green,a*表示);以及黄到蓝(yellow-blue,b*表示)。亮度参数L*可以用来了解更多关于观看者将如何感知matplotlib伪色彩图的信息。

  学习人类对伪色彩图感知的一个很好的起点资源来自[IBM]。

伪色彩图的类别  伪色彩图通常根据其功能分为几个类别(例如参见[Moreland]):1、顺序:亮度和饱和度的变化通常是递增的,通常使用单一色调;应用于表示能排序的信息。2、发散:两种不同颜色的亮度和饱和度的变化,这两种颜色在中间以不饱和的颜色相遇(开始是饱和的);绘制的信息应具有临界中间值时使用,例如地形图,或数据分布在0的两侧附近。3、循环:两种不同颜色的亮度变化,在中间相遇,开始/结束时为非饱和颜色;应用于在端点处环绕的值,例如相位角、风向或一天中的时间。4、定性:常为杂色;应用于表示不能排序或关联的信息。

· 

· 

· 

· 

· 

import numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltfrom colorspacious import cspace_converter#pip install colorspacious

  首先,我们将显示每个颜色映射的范围。请注意,有些人的感知颜色变化似乎比其他人更快。

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

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


顺序  对于“顺序”绘图,通过颜色映射单调增加亮度值。这很好。一些伪色彩图中的亮度(L*)值范围从0到100(二进制和其他进制的灰度),而其他则从L*=20左右开始。那些L*范围较小的相应地具有较小的感知范围。还要注意的是L*作用在不同颜色映射中各不相同:有些L*接近线性,而另一些则是非线性的。

· 

· 

plot_color_gradients('Perceptually Uniform Sequential',                     ['viridis', 'plasma', 'inferno', 'magma', 'cividis'])

  安装colorspacious后,把上面三部分程序合在一起运行,结果:  执行下面的调用:

· 

· 

· 

· 

plot_color_gradients('Sequential',                     ['Greys', 'Purples', 'Blues', 'Greens', 'Oranges', 'Reds',                      'YlOrBr', 'YlOrRd', 'OrRd', 'PuRd', 'RdPu', 'BuPu',                      'GnBu', 'PuBu', 'YlGnBu', 'PuBuGn', 'BuGn', 'YlGn'])

 

顺序2  下图中,许多顺序2”绘图中的L*值单调增加,但有些(autumn, cool, spring, and winter)趋于平稳,或甚至同上同下。另外,如afmhot, copper, gist_heat, and hot,L*的作用有弯曲。在处于平稳或弯曲的颜色映射区域中表示的数据,将导致对颜色图中这些值中的数据的分级感知(有关这方面的优秀示例,请参见[mycarta-banding])。

· 

· 

· 

· 

plot_color_gradients('Sequential (2)',                     ['binary', 'gist_yarg', 'gist_gray', 'gray', 'bone',                      'pink', 'spring', 'summer', 'autumn', 'winter', 'cool',                      'Wistia', 'hot', 'afmhot', 'gist_heat', 'copper'])

 

本文链接matplotlib.colormaps:

https://matplotlib.org/stable/api/matplotlib_configuration_api.html#matplotlib.colormaps

Third-party colormaps:

https://matplotlib.org/mpl-third-party/#colormaps-and-styles

Creating Colormaps in Matplotlib:

https://matplotlib.org/stable/tutorials/colors/colormap-manipulation.html

Ware:

http://ccom.unh.edu/sites/default/files/publications/Ware_1988_CGA_Color_sequences_univariate_maps.pdf

IBM:

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

Moreland:

http://www.kennethmoreland.com/color-maps/ColorMapsExpanded.pdf

mycarta-banding:

https://mycarta.wordpress.com/2012/10/14/the-rainbow-is-deadlong-live-the-rainbow-part-4-cie-lab-heated-body/