Skip to content

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

Updated on

5 个开箱即用的 matplilib cmaps/colormaps 示例,你可以用于学习或直接复制后修改。

Matplotlib 的 colormap(cmap)系统远不止“选一个配色方案”这么简单。理解这个 API 之后,你可以:

  • 可视化连续数值(heatmap、图像)
  • 在散点图中编码额外维度
  • 为类别创建离散 colormap
  • 对棘手数据使用非线性缩放(log、边界分段)
  • 从 colormap 中采样颜色,用于自定义图表样式

这篇文章会通过 5 个常见模式,配合 代码 + 实际图表,带你掌握用法。你可以把每段代码直接复制到自己的 notebook 或脚本中使用。

所有示例都假定已导入:

import numpy as np
import matplotlib.pyplot as plt

1. 使用 imshow 的连续 colormap

最基础的 colormap 用法是用 imshow 来可视化 2D 数组——比如 heatmap、图像或者任意规则网格数据。

matplotlib-viridis-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 在散点图中编码一个额外的数值维度(比如时间、强度、概率等)。

Scatter plot with colormap and colorbar

代码

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 默认是连续的,但你也可以用它来创建一小组 离散颜色,用于类别数据(分类结果、标签等)。

Discrete colormap for categories

代码

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 之类的 归一化函数 结合起来使用。

ogNorm colormap

代码

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] 区间。
  • 可以和 pcolormeshimshowscatter 等多种绘图函数搭配使用。
  • 其他常见的 norm:NormalizeBoundaryNormPowerNorm 等。

5. 从 colormap 抽取颜色用于折线图

colormap 不只能用在“填充类”图表上。你可以 从 colormap 中采样单个颜色,在任意地方使用——比如折线、柱状图、标注等。

Sampling colors from a colormap for line plots

代码

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 的大量日常用法:

  1. 使用 imshow + cmap 绘制 连续 heatmap
  2. 散点图 中用颜色编码额外的数值维度。
  3. 利用 ListedColormap 实现 离散类别配色
  4. 把 colormap 与 LogNorm(以及其他 norm)结合,实现 非线性缩放
  5. 从 colormap 中 采样颜色,用于自定义样式(折线、柱状图等)。

熟练掌握这些之后,你可以继续探索:

  • 自定义 colormap(由你自己的颜色列表或外部工具生成)
  • BoundaryNorm 为离散数值区间(如分箱)构建 colormap
  • 使用感知均匀的 colormap(如 viridisplasmacividis 等),提升可读性和可访问性