Matplotlib 简明教程

Matplotlib - Choosing Colormaps

Colormap 也被称为调色板,是一系列颜色,代表了一系列连续的值。它允许您通过颜色的变化有效地表示信息。

请参阅下列图片,其中引用了一些 matplotlib 中的内置 colormaps:

choosing colormaps input

Matplotlib 提供了各种内置 colormaps(可以在 matplotlib.colormaps 模块中找到)和第三方 colormaps 以用于各种应用程序。

Choosing Colormaps in Matplotlib

选择合适的 colormap 涉及为你的数据集在 3D 颜色空间中找到合适的表示方式。

选择任何给定数据集的适用 colormap 的因素包括:

  1. Nature of Data − 表示形式数据还是度量数据

  2. Knowledge of the Dataset − 理解数据集的特点。

  3. Intuitive Color Scheme − 考虑是否有针对要绘制的参数的直观配色方案。

  4. Field Standards − 考虑是否有受众可能期望的行业标准。

对于大多数应用程序,建议使用感知一致的 colormap,确保数据中的相等步长在颜色空间中被感知为相等步长。这改进了人脑解释,特别是当明度变化比色调变化更明显时。

Categories of Colormaps

Colormaps 根据其功能分类:

  1. Sequential − 明度和饱和度的逐步变化,通常使用单色调。适合表示有序的信息。

  2. Diverging − 两色的明度和饱和度变化,在非饱和色处相交。非常适合具有临界中间值的数据,例如地形或围绕零点偏离的数据。

  3. Cyclic − 两种颜色的明度变化,在中间相遇,并在非饱和色处开始/结束。适合在端点环绕值的情况,例如相位角或一天中的时间。

  4. Qualitative − 不带特定顺序的杂色。用于表示无顺序或关系的信息。

Sequential Colormaps

顺序色图显示出在色图中递增的明度值。这种特性确保了色差感知的平滑过渡,使其适合表示有序信息。然而,值得注意的是,根据它们跨越的值的范围,色图之间的知觉范围可能有所不同。

让我们通过可视化渐变并了解其明度值如何演变来探索顺序色图。

以下示例提供了 Matplotlib 中可用的不同 Sequential 色图的渐变的可视表示。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

# List of Sequential colormaps to visualize
cmap_list = ['Greys', 'Purples', 'Blues', 'Greens', 'Oranges', 'Reds',
   'YlOrBr', 'YlOrRd', 'OrRd', 'PuRd', 'RdPu', 'BuPu',
   'GnBu', 'PuBu', 'YlGnBu', 'PuBuGn', 'BuGn', 'YlGn']

# Plot the color gradients

gradient = np.linspace(0, 1, 256)
gradient = np.vstack((gradient, gradient))

# Create figure and adjust figure height to the 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=(7, figh))
fig.subplots_adjust(top=1 - 0.35 / figh, bottom=0.15 / figh,
   left=0.2, right=0.99)
axs[0].set_title('Sequential colormaps', fontsize=14)

for ax, name in zip(axs, cmap_list):
   ax.imshow(gradient, aspect='auto', cmap=mpl.colormaps[name])
   ax.text(-0.1, 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()

# Show the plot
plt.show()

执行上述代码,我们将得到以下输出 −

choosing colormaps ex1

Diverging Colormaps

分歧色图的特点是明度值先单调递增,然后再递减,最大明度接近于中性中点。

以下示例提供了 Matplotlib 中可用的不同分歧色图的渐变的可视表示。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

# List of Diverging colormaps to visualize
cmap_list = ['PiYG', 'PRGn', 'BrBG', 'PuOr', 'RdGy', 'RdBu', 'RdYlBu',
   'RdYlGn', 'Spectral', 'coolwarm', 'bwr', 'seismic']

# Plot the color gradients
gradient = np.linspace(0, 1, 256)
gradient = np.vstack((gradient, gradient))

# Create figure and adjust figure height to the 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=(7, figh))
fig.subplots_adjust(top=1 - 0.35 / figh, bottom=0.15 / figh,
   left=0.2, right=0.99)
axs[0].set_title('Diverging colormaps', fontsize=14)

for ax, name in zip(axs, cmap_list):
   ax.imshow(gradient, aspect='auto', cmap=mpl.colormaps[name])
   ax.text(-0.1, 0.5, name, va='center', ha='left', fontsize=10,
      transform=ax.transAxes)

# Turn off all ticks & spines, not just the ones with colormaps.
for ax in axs:
   ax.set_axis_off()

# Show the plot
plt.show()

执行上述代码,我们将得到以下输出 −

choosing colormaps ex2

Cyclic Colormaps

循环色图呈现出一种独特的设计,其中色图在同一种颜色上开始和结束,在对称中心点相遇。明度值的进展应从开始到中间单调变化,从中间到结束逆向变化。

在以下示例中,您可以探索和可视化 Matplotlib 中可用的各种循环色图。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

# List of Cyclic colormaps to visualize
cmap_list = ['twilight', 'twilight_shifted', 'hsv']

# Plot the color gradients
gradient = np.linspace(0, 1, 256)
gradient = np.vstack((gradient, gradient))

# Create figure and adjust figure height to the 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=(7, figh))
fig.subplots_adjust(top=1 - 0.35 / figh, bottom=0.15 / figh,
   left=0.2, right=0.99)
axs[0].set_title('Cyclic colormaps', fontsize=14)

for ax, name in zip(axs, cmap_list):
   ax.imshow(gradient, aspect='auto', cmap=mpl.colormaps[name])
   ax.text(-0.1, 0.5, name, va='center', ha='left', fontsize=10,
      transform=ax.transAxes)

# Turn off all ticks & spines, not just the ones with colormaps.
for ax in axs:
   ax.set_axis_off()

# Show the plot
plt.show()

执行上述代码,我们将得到以下输出 −

choosing colormaps ex3

Qualitative colormaps

定性色图不同于知觉图,因为它们并非设计为提供知觉一致性,而是旨在表示不具有顺序或关系的信息。整个色图中的明度值差异很大,并且不会单调递增。因此,不建议将定性色图用作知觉色图。

以下示例提供了 Matplotlib 中可用的不同定性色图的可视表示。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

# List of Qualitative colormaps to visualize
cmap_list = ['Pastel1', 'Pastel2', 'Paired', 'Accent', 'Dark2',
   'Set1', 'Set2', 'Set3', 'tab10', 'tab20', 'tab20b', 'tab20c']

# Plot the color gradients
gradient = np.linspace(0, 1, 256)
gradient = np.vstack((gradient, gradient))

# Create figure and adjust figure height to the 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=(7, figh))
fig.subplots_adjust(top=1 - 0.35 / figh, bottom=0.15 / figh,
   left=0.2, right=0.99)
axs[0].set_title('Qualitative colormaps', fontsize=14)

for ax, name in zip(axs, cmap_list):
   ax.imshow(gradient, aspect='auto', cmap=mpl.colormaps[name])
   ax.text(-0.1, 0.5, name, va='center', ha='left', fontsize=10,
      transform=ax.transAxes)

# Turn off all ticks & spines, not just the ones with colormaps.
for ax in axs:
   ax.set_axis_off()

# Show the plot
plt.show()

执行上述代码,我们将得到以下输出 −

choosing colormaps ex4