5 种常见的 Matplotlib Colormap(cmaps)用法
Updated on

Matplotlib 的 colormap(cmap)系统远不止“选一个配色方案”这么简单。理解这个 API 之后,你可以:
- 可视化连续数值(heatmap、图像)
- 在散点图中编码额外维度
- 为类别创建离散 colormap
- 对棘手数据使用非线性缩放(log、边界分段)
- 从 colormap 中采样颜色,用于自定义图表样式
这篇文章会通过 5 个常见模式,配合 代码 + 实际图表,带你掌握用法。你可以把每段代码直接复制到自己的 notebook 或脚本中使用。
所有示例都假定已导入:
import numpy as np
import matplotlib.pyplot as plt1. 使用 imshow 的连续 colormap
最基础的 colormap 用法是用 imshow 来可视化 2D 数组——比如 heatmap、图像或者任意规则网格数据。

代码
import numpy as np
import matplotlib.pyplot as plt
# 生成一些类似随机的 2D 数据
data = np.random.randn(50, 50).cumsum(axis=0)
plt.figure()
plt.imshow(data, cmap="viridis")
plt.colorbar()
plt.title("Continuous colormap with imshow (viridis)")
plt.tight_layout()
plt.show()图表
你会得到一个使用感知均匀 colormap viridis 的平滑 heatmap:
(对应上面的第一张图:紫色到绿色渐变的 heatmap,右侧带有 colorbar。)
要点:
cmap="viridis"选择使用的 colormap。plt.colorbar()绘制颜色刻度条,方便读者理解数值范围。- 任意 2D NumPy 数组都可以传给
imshow。
2. 带 colormap 和 colorbar 的散点图
你可以利用 colormap 在散点图中编码一个额外的数值维度(比如时间、强度、概率等)。

代码
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
x = np.linspace(0, 10, 200)
y = np.sin(x) + 0.1 * np.random.randn(200)
# 为每个点指定一个数值,用 colormap 映射
values = np.linspace(0, 1, 200)
plt.figure()
scatter = plt.scatter(x, y, c=values, cmap="plasma")
plt.colorbar(scatter, label="value")
plt.title("Scatter with colormap (plasma)")
plt.xlabel("x")
plt.ylabel("sin(x) + noise")
plt.tight_layout()
plt.show()图表
你会得到一张 散点图,点的颜色沿着 plasma colormap 平滑过渡,并配有 colorbar 说明颜色代表的数值。
要点:
c=values提供要映射到颜色的数值数据。cmap="plasma"选择 colormap。- 将
scatter对象传给plt.colorbar(),可以保证 colorbar 与散点颜色一致。
3. 用离散 colormap 表示类别
colormap 默认是连续的,但你也可以用它来创建一小组 离散颜色,用于类别数据(分类结果、标签等)。

代码
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
# 构造 4 类分类结果
categories = np.random.randint(0, 4, 100)
x = np.random.randn(100)
y = np.random.randn(100)
# 从 tab10 的前 4 个颜色构建离散 colormap
base_cmap = plt.cm.tab10
cmap_disc = ListedColormap(base_cmap(np.linspace(0, 1, 4)))
plt.figure()
for i in range(4):
mask = categories == i
# 为每个类别使用单一颜色
plt.scatter(x[mask], y[mask], c=[cmap_disc(i)], label=f"class {i}")
plt.legend()
plt.title("Discrete colormap for categories (tab10 subset)")
plt.xlabel("x")
plt.ylabel("y")
plt.tight_layout()
plt.show()图表
你会看到一张散点图,每个类别(0–3)都有自己独立的颜色,这些颜色来自 tab10。
要点:
ListedColormap允许你从一个 颜色列表 构造 colormap。- 当你只需要少量且稳定的类别配色时,这种方式非常合适。
- 这里使用了定性 colormap
tab10,并从中取了 4 个颜色。
4. 搭配 LogNorm 的归一化与 colormap
有时候数据跨越好几个数量级。直接线性映射到颜色往往会掩盖结构。这种情况下,可以把 colormap 和 LogNorm 之类的 归一化函数 结合起来使用。

代码
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
x = np.linspace(0.01, 2, 200)
y = np.linspace(0.01, 2, 200)
X, Y = np.meshgrid(x, y)
Z = np.exp(X * Y) # 增长非常快
plt.figure()
pcm = plt.pcolormesh(X, Y, Z, norm=LogNorm(), cmap="magma")
plt.colorbar(pcm, label="exp(x * y)")
plt.title("LogNorm with colormap (magma)")
plt.xlabel("x")
plt.ylabel("y")
plt.tight_layout()
plt.show()图表
你会看到一块 2D 彩色区域,得益于对数缩放,小值和大值区域的结构都能清晰呈现,使用的是 magma colormap。
要点:
norm=LogNorm()控制数值如何在应用cmap之前映射到 [0, 1] 区间。- 可以和
pcolormesh、imshow、scatter等多种绘图函数搭配使用。 - 其他常见的 norm:
Normalize、BoundaryNorm、PowerNorm等。
5. 从 colormap 抽取颜色用于折线图
colormap 不只能用在“填充类”图表上。你可以 从 colormap 中采样单个颜色,在任意地方使用——比如折线、柱状图、标注等。

代码
import numpy as np
import matplotlib.pyplot as plt
cmap = plt.cm.cividis # 选择任意你喜欢的 colormap
xs = np.linspace(0, 10, 200)
plt.figure()
for i, freq in enumerate(np.linspace(0.5, 2.5, 6)):
ys = np.sin(freq * xs)
color = cmap(i / 5.0) # 在 colormap 上均匀采样
plt.plot(xs, ys, label=f"freq={freq:.1f}", color=color)
plt.legend(title="frequency")
plt.title("Sampling colors from colormap (cividis)")
plt.xlabel("x")
plt.ylabel("sin(freq * x)")
plt.tight_layout()
plt.show()图表
你会得到多条正弦曲线,每条曲线的颜色都是从 cividis colormap 中取出的,沿 colormap 平滑变化。
要点:
plt.cm.<name>返回一个可以 像函数一样调用 的 colormap 对象。cmap(t)会返回t(位于[0, 1])对应的 RGBA 颜色。- 这是获取一致、美观配色方案的一个简洁方法。
总结
这 5 个模式覆盖了 Matplotlib colormap 的大量日常用法:
- 使用
imshow+cmap绘制 连续 heatmap。 - 在 散点图 中用颜色编码额外的数值维度。
- 利用
ListedColormap实现 离散类别配色。 - 把 colormap 与
LogNorm(以及其他 norm)结合,实现 非线性缩放。 - 从 colormap 中 采样颜色,用于自定义样式(折线、柱状图等)。
熟练掌握这些之后,你可以继续探索:
- 自定义 colormap(由你自己的颜色列表或外部工具生成)
- 用
BoundaryNorm为离散数值区间(如分箱)构建 colormap - 使用感知均匀的 colormap(如
viridis、plasma、cividis等),提升可读性和可访问性