- 什么是 Colormap?
- 如何使用 Colormap?(Matplotlib 示例)
- Colormap 的分类与选择
- 如何创建和修改 Colormap?
- 常用 Colormap 及其应用场景
- 在不同库中的使用
什么是 Colormap?
想象一下,你有一组从 0 到 100 的数字,如果直接显示它们,你可能只会看到一堆数字,很难看出它们之间的模式和差异。colormap 就像一个“颜色翻译器”,它为这组数字中的每一个值分配一个特定的颜色。

这个过程通常是这样的:
数据值 -> 归一化到 [0, 1] -> 映射到 Colormap 的颜色条上 -> 生成最终颜色
在 'viridis' 这个 colormap 中,数值 0 可能对应深紫色,0.5 对应亮绿色,而 1 对应亮黄色。
如何使用 Colormap?(以 Matplotlib 为例)
在 Python 的数据可视化库中,Matplotlib 是最基础也是最广泛使用的一个,它对 colormap 的支持非常完善,我们主要以 Matplotlib 为例进行说明。
基本用法:imshow 或 pcolormesh
这两个函数常用于显示二维数据矩阵(如热力图)。cmap 参数直接指定要使用的 colormap 名称。

import numpy as np import matplotlib.pyplot as plt # 创建一些示例数据 data = np.random.rand(10, 10) # --- 使用不同的 colormap --- # 1. 'viridis' (默认之一,色盲友好) plt.figure(figsize=(12, 3)) plt.subplot(1, 4, 1) plt.imshow(data, cmap='viridis')'viridis') # 2. 'plasma' plt.subplot(1, 4, 2) plt.imshow(data, cmap='plasma')'plasma') # 3. 'inferno' plt.subplot(1, 4, 3) plt.imshow(data, cmap='inferno')'inferno') # 4. 'magma' plt.subplot(1, 4, 4) plt.imshow(data, cmap='magma')'magma') plt.tight_layout() plt.show()
在散点图中使用 c 参数和 cmap
在散点图中,c 参数用于指定每个点的数值,cmap 参数则用于根据这些数值来决定点的颜色。
import numpy as np import matplotlib.pyplot as plt # 生成数据 x = np.random.rand(50) y = np.random.rand(50) # 这是决定颜色的数值 colors = np.random.rand(50) plt.scatter(x, y, c=colors, cmap='coolwarm') plt.colorbar() # 显示颜色条'Scatter Plot with Colormap') plt.show()
这里,c=colors 告诉 Matplotlib 用 colors 数组中的值来着色,而 cmap='coolwarm' 定义了从蓝色(低值)到红色(高值)的渐变。
在 3D 曲面图中使用
在 plot_surface 中,cmap 参数同样可以用来根据曲面的高度(Z值)进行着色。
from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 创建数据 X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) # 使用 cmap 进行着色 surf = ax.plot_surface(X, Y, Z, cmap='jet', linewidth=0, antialiased=False) fig.colorbar(surf, shrink=0.5, aspect=5) # 添加颜色条'3D Surface with Colormap') plt.show()
Colormap 的分类与选择
选择合适的 colormap 至关重要,错误的 colormap 可能会误导观众,Matplotlib 中的 colormap 主要分为三大类:

a) 顺序型
这类 colormap 的颜色变化是单一、连续的,通常从浅到深或从一种颜色渐变到另一种颜色,它们非常适合表示有序的、连续的数据,如温度、高度、人口密度等。
- 特点: 没有明显的中间值,视觉上是单调的。
- 常用:
'viridis','plasma','inferno','magma','cividis','Greys','Blues'。
强烈推荐:
'viridis'和'plasma',它们是现代科学可视化的默认选择,因为它们不仅美观,更重要的是对色盲友好,并且在打印为黑白图像时也能保持较好的可区分度。
b) 发散型
这类 colormap 通常从一种颜色(如白色、浅灰色)开始,向两个方向(通常是两种对比色,如蓝-红)渐变,它们非常适合表示有中性基准点或需要强调偏离中心的数据,如温度异常(相对于平均温度)、误差、相关性等。
- 特点: 中心有一个明显的断点或中性色。
- 常用:
'RdBu'(红-蓝),'coolwarm','seismic','PiYG'。
警告: 避免使用
'jet'(彩虹色)!它是一个经典的发散型 colormap,但存在严重缺陷:在视觉上不均匀(绿色区域比红蓝区域更“突出”),并且容易产生虚假的等高线效果,误导数据解读。
c) 循环/定性型
这类 colormap 的颜色是循环的或没有特定顺序,它们不适合表示有序数据,但可以用来表示没有内在顺序的类别数据。
- 循环型: 颜色从一端开始,经过一系列变化后,平滑地回到起始颜色,适合表示角度、周期性数据等。
- 常用:
'twilight','hsv'。
- 常用:
- 定性型: 一系列互不相关的、高饱和度的颜色,用于区分不同的类别。
- 常用:
'tab10','tab20','Set1','Pastel1'。
- 常用:
如何创建和修改 Colormap?
除了使用内置的 colormap,你还可以创建自己的。
从列表创建自定义 Colormap
你可以提供一个颜色列表(可以是颜色名称或十六进制代码)来创建一个 LinearSegmentedColormap。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
# 定义自定义颜色列表
colors = ["darkblue", "blue", "lightblue", "white", "pink", "red", "darkred"]
n_bins = 100 # 将颜色分成多少段
# 创建自定义 colormap
cmap_name = 'ocean_to_lava'
custom_cmap = LinearSegmentedColormap.from_list(cmap_name, colors, N=n_bins)
# 测试自定义 colormap
data = np.linspace(0, 1, 256).reshape(1, -1)
plt.figure(figsize=(6, 1))
plt.imshow(data, aspect='auto', cmap=custom_cmap)f"Custom Colormap: '{cmap_name}'")
plt.axis('off')
plt.show()
反转 Colormap
只需要在 colormap 名称后加一个 _r 即可。
import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(10, 10)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
# 原始 colormap
im1 = ax1.imshow(data, cmap='viridis')
ax1.set_title('viridis')
fig.colorbar(im1, ax=ax1)
# 反转 colormap
im2 = ax2.imshow(data, cmap='viridis_r')
ax2.set_title('viridis (reversed)')
fig.colorbar(im2, ax=ax2)
plt.show()
常用 Colormap 及其应用场景
| Colormap 名称 | 类型 | 主要应用场景 | 备注 |
|---|---|---|---|
viridis |
顺序型 | 默认首选,任何连续数据,如高度、温度、密度。 | 色盲友好,打印友好。 |
plasma |
顺序型 | 类似 viridis,但颜色更“热”,适合强调高值。 |
色盲友好。 |
inferno / magma |
顺序型 | 黑暗背景下使用,颜色对比度高。 | 色盲友好。 |
cividis |
顺序型 | 专门为色盲人士和黑白打印优化。 | 强烈推荐用于需要广泛传播的图表。 |
Greys |
顺序型 | 简单的灰度图,或用于学术论文。 | 经典、简洁。 |
coolwarm |
发散型 | 强调相对于零或均值的偏差。 | 比 jet 好得多,是 jet 的安全替代品。 |
RdBu (Red-Blue) |
发散型 | 类似 coolwarm,对比度更强。 |
注意红色和蓝色在色盲人群中可能难以区分。 |
seismic |
发散型 | 另一个流行的发散型选择。 | 中间是白色,对比明显。 |
jet |
发散型 | 强烈不推荐。 | 视觉不均,容易产生误导。 |
tab10 / tab20 |
定性型 | 区分少量(10/20个)无序的类别。 | Matplotlib 默认的类别色板,颜色区分度高。 |
hsv |
循环型 | 表示角度、周期性数据,或创造艺术效果。 | 色相循环,亮度和饱和度不变。 |
在不同库中的使用
虽然 Matplotlib 是基础,但其他高级库也沿用了或兼容了 Matplotlib 的 colormap 系统。
Seaborn
Seaborn 是一个基于 Matplotlib 的高级可视化库,它有自己的默认 colormap,但也可以无缝使用 Matplotlib 的所有 colormap。
import seaborn as sns import matplotlib.pyplot as plt import numpy as np # 使用 Seaborn 的 heatmap data = np.random.randn(10, 10) # cmap 参数直接传入 Matplotlib 的 colormap 名称 ax = sns.heatmap(data, cmap='viridis', center=0)'Seaborn Heatmap with Matplotlib cmap') plt.show()
Plotly
Plotly 是一个交互式可视化库,它同样支持 Matplotlib 的 colormap。
import plotly.express as px
import numpy as np
# 使用 Plotly Express
df = px.data.iris()
# color_continuous_scale 参数对应 cmap
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="petal_length",
color_continuous_scale='viridis') # 使用 'viridis'
fig.show()
colormap(或cmap) 是将数据值映射为颜色的关键参数。- 在 Matplotlib 中,它广泛用于
imshow,scatter,plot_surface等函数。 - 选择时务必考虑数据类型:
- 连续数据 -> 顺序型 (
viridis,plasma)。 - 有基准点的数据 -> 发散型 (
coolwarm,RdBu)。 - 无序类别数据 -> 定性型 (
tab10)。
- 连续数据 -> 顺序型 (
- 避免使用
jet,优先选择对色盲友好的viridis,plasma,cividis。 - 你可以通过
from_list创建自己的 colormap,或通过_r后缀轻松反转现有的 colormap。
