← 返回Book 2目录
第06章

颜色映射

Colormap · 数值到颜色的映射艺术

从基础色谱到自定义设计,掌握数据可视化的色彩语言

🎨 章节概览

颜色映射(Colormap)是数据可视化的核心工具,它定义了从数值到颜色的映射规则。 Matplotlib提供178个内置色谱,涵盖顺序型、发散型、循环型等多种类型。 本章将系统学习色谱的选择、应用、空间位置分析,以及如何创建自定义色谱。

📚
基础知识
178个内置色谱 · 数值映射
🔬
空间分析
RGB/HSV色彩空间轨迹
🎨
自定义设计
LinearSegmentedColormap
🚀

革命性交互体验

通过直接操作理解色谱-数据匹配原则

💡 学习目标:在实验室中切换数据类型和色谱,实时观察适配性评分和智能建议。 通过"做中学"建立色谱选择的直觉,理解为什么某些组合有效,某些会产生误导。

🎨 色谱实验室(Colormap Lab)

通过直接操作理解色谱类型与数据类型的匹配关系

数据类型选择

🧪 探索建议

  • • 切换不同数据类型,观察哪些色谱更合适
  • • 注意发散型数据的中心值如何被突出
  • • 观察循环型数据的首尾连续性
  • • 尝试"错误"搭配,理解为什么不合适
✅
适配性评分: 100/100
viridis × sequential
✅ 完美匹配!顺序型色谱适合单调数据

选择色谱

sequential
diverging
cyclic
categorical

💡 关键洞察

Sequential(顺序型):单方向渐变,如 viridis
Diverging(发散型):中心对称,如 RdBu_r
Cyclic(循环型):首尾相连,如 twilight
Categorical(分类型):离散颜色,如 tab10

📚 色谱-数据匹配原则

✅ 正确匹配示例
  • • 温度数据 → viridis(顺序型)
  • • 偏差数据 → RdBu_r(发散型)
  • • 角度数据 → twilight(循环型)
  • • 类别数据 → tab10(分类型)
💡 选择依据
  • • 数据特性:单调/对称/周期/离散
  • • 感知均匀性:viridis优于jet
  • • 色盲友好:避免红绿组合
  • • 打印友好:避免纯黄纯青
❌ 常见错误
  • • 顺序数据用发散色谱 → 中心被误导性强调
  • • 循环数据用顺序色谱 → 产生伪边界
  • • 分类数据用连续色谱 → 暗示不存在的顺序
  • • 使用jet/rainbow → 感知不均匀,色盲不友好
🔬 验证方法
  • • 灰度测试:转为灰度看感知是否均匀
  • • 色盲模拟:使用工具检查可访问性
  • • 打印预览:检查打印效果
  • • 用户测试:询问他人理解是否正确
🎯 实验目标:通过"做中学"建立色谱选择的直觉。 观察不同搭配的效果,理解为什么某些组合有效,某些组合会误导。 这是数据可视化的核心技能之一。
Python实现
import matplotlib.pyplot as plt
import numpy as np

# 选择合适的色谱
data_type = 'sequential'
if data_type == 'sequential':
    cmap = 'viridis'  # 或 plasma, inferno, magma
elif data_type == 'diverging':
    cmap = 'RdBu_r'   # 或 coolwarm, seismic
elif data_type == 'cyclic':
    cmap = 'twilight' # 或 hsv
else:
    cmap = 'tab10'    # 或 Set1, Set2

# 绘制热图
plt.imshow(data, cmap=cmap)
plt.colorbar()
6.1

颜色映射基础

Matplotlib Colormaps · 178个内置色谱

Matplotlib提供了丰富的内置色谱库,包括Sequential(顺序型)、Diverging(发散型)、Cyclic(循环型)等多种类型。 每种色谱都有其特定的应用场景和感知特性。理解色谱的分类和使用方法是数据可视化的基础技能。

6.1 颜色映射探索器(Colormap Explorer)

探索Matplotlib的178个内置色谱,理解数值到颜色的映射关系

RdYlBu_r
红-黄-蓝(反转)

数值 → 颜色映射

0.00
→
#313695
0.25
→
#74add1
0.50
→
#ffffbf
0.75
→
#fdae61
1.00
→
#a50026
类别
diverging
颜色数量
11

🎨 探索建议

  • • 点击下方色谱卡片,切换不同的colormap
  • • Sequential(顺序型):适合单调数据
  • • Diverging(发散型):适合有中心值的数据
  • • Cyclic(循环型):适合周期性数据

💻 Matplotlib Colormap 使用

获取色谱
import matplotlib.pyplot as plt
cmap = plt.get_cmap('RdYlBu_r')
color = cmap(0.5) # 获取中间颜色
数值映射
from matplotlib.colors import Normalize
norm = Normalize(vmin=0, vmax=100)
colors = cmap(norm(data))
💡 关键概念:Colormap是从[0,1]到RGBA颜色的映射函数。输入标准化数值,输出对应颜色。
📊
Sequential
用于单调递增/递减数据:温度、高度、密度等
🎯
Diverging
用于有中心值的数据:偏差、相关系数、异常检测
🔄
Cyclic
用于周期性数据:角度、相位、时间(小时)
6.2

用指定色谱绘制三维网格曲面

3D Surface · Peaks函数可视化

使用plot_surface()绘制三维曲面时, 色谱用于编码Z轴(高度)信息。通过cmap参数可以指定不同的色谱, 如RdYlBu、viridis等。还可以通过cmap + '_r'翻转色谱方向。

6.2 三维曲面色谱(3D Surface Colormap)

使用色谱为peaks函数的三维曲面着色

📐 Peaks 函数

f(x,y) = 3(1-x)²exp(-x²-(y+1)²)
- 10(x/5-x³-y⁵)exp(-x²-y²)
- (1/3)exp(-(x+1)²-y²)

色谱选择

Azimuth-135°
Elevation30°
6.3

用指定色谱绘制等高线

Contour · 填充与非填充模式

等高线图有两种模式:contourf()填充模式展示连续的色彩过渡, 适合表现温度、高度等连续变量;contour()非填充模式只绘制等高线, 常用于叠加到其他图形上。不同色谱会产生截然不同的视觉效果。

6.3 等高线色谱(Contour Colormap)

使用色谱绘制填充/非填充等高线

色谱选择

💡 使用场景

  • • 填充等高线:contourf(),适合展示连续变化
  • • 非填充等高线:contour(),适合叠加到其他图上
  • • 气象图、地形图、热力图常用此方式
6.4

可视化色谱在色彩空间位置

RGB & HSV · 色谱轨迹分析

每个色谱实际上是RGB立方体或HSV圆柱中的一条曲线轨迹。 通过三维可视化色谱的色号位置,可以理解不同色谱的空间特性:viridis是感知均匀的轨迹,rainbow/jet是绕RGB立方体的螺旋,hsv是HSV圆柱的完整环形。这种分析有助于理解色谱的感知特性。

6.4 & 6.5 色谱在色彩空间中的位置

可视化色谱在RGB立方体和HSV圆柱中的轨迹

RGB

色谱选择

Azimuth38°
Elevation34°

🔍 观察要点

  • • RGB空间:色谱是立方体内的曲线轨迹
  • • HSV空间:色谱在圆柱坐标中展示
  • • 不同色谱有不同的空间特性和感知均匀性
6.6

自定义色谱

Custom Colormap · LinearSegmentedColormap

使用LinearSegmentedColormap.from_list()可以创建自定义色谱。通过指定颜色节点和位置, 系统会自动在节点之间进行线性插值。节点可以均匀分布,也可以不均匀分布。 不均匀节点的色谱可以强调特定数值范围,如离群值检测。

6.6 自定义色谱构建器(Custom Colormap Builder)

使用LinearSegmentedColormap创建自定义连续色谱

0.00
0.50
1.00

预设方案

🎨 色谱设计原则

  • • 均匀节点:适合对称数据(如偏差)
  • • 不均匀节点:强调特定范围(如离群值)
  • • 循环色谱:首尾颜色相同,用于周期数据
  • • 白色中心:适合发散型数据,0值显示为白色

颜色节点

Python代码
from matplotlib.colors import LinearSegmentedColormap

list_nodes = [0.00, 0.50, 1.00]
list_colors = ['#00008b', '#ffffff', '#ff00ff']

custom_cmap = LinearSegmentedColormap.from_list(
    "custom_colormap",
    list(zip(list_nodes, list_colors))
)

💻 LinearSegmentedColormap 原理

关键参数
  • • list_nodes: 位置列表 [0, 1] 范围
  • • list_colors: 颜色列表(RGB/名称/Hex)
  • • 节点之间使用线性插值
应用场景
  • • 品牌色定制热力图
  • • 科学可视化(特定颜色表示特定含义)
  • • 提升数据可读性
6.7

使用自定义色谱绘制热图

Heatmap · 连续vs离散色谱

热图(Heatmap)是色谱最常见的应用场景。使用seaborn.heatmap()可以快速绘制热图。本节对比三种色谱类型:连续色谱(均匀节点)适合对称数据,连续色谱(不均匀节点)强调离群值,离散色谱用于区间分类。 理解这些差异有助于选择合适的色谱。

6.7 热图色谱应用(Heatmap with Custom Colormap)

使用自定义色谱绘制热图,展示标准正态分布随机数

色谱范围:[-3, 3]
-3
+3

色谱类型

📊 数据统计

矩阵大小
20 × 20
数据类型
标准正态
范围
[-3σ, +3σ]
对称中心
0(白色)

💡 设计要点

  • • 5个颜色均匀分布在[0, 1]
  • • 白色位于中心(0.5),对应数值0
  • • 适合对称数据可视化
Seaborn Heatmap
sns.heatmap(data, 
    vmin=-3, vmax=3,
    cmap=custom_cmap,
    linewidths=0.1)

📚章节总结

色谱分类与选择

  • ✓ Sequential(顺序型):单调递增数据,如温度、高度
  • ✓ Diverging(发散型):有中心值的数据,如偏差、相关系数
  • ✓ Cyclic(循环型):周期性数据,如角度、时间
  • ✓ Qualitative(定性型):分类数据,无顺序关系
  • ✓ viridis、plasma为感知均匀色谱,推荐优先使用

自定义色谱设计

  • ✓ LinearSegmentedColormap:连续色谱,线性插值
  • ✓ ListedColormap:离散色谱,直接指定颜色
  • ✓ 均匀节点:颜色均匀分布,适合对称数据
  • ✓ 不均匀节点:强调特定范围,如离群值
  • ✓ 循环色谱:首尾颜色相同,用于周期数据

💡 核心洞察: 色谱不仅是美学工具,更是信息编码的手段。 好的色谱应该:(1) 感知均匀(数值变化 = 颜色变化), (2) 色盲友好(viridis、plasma), (3) 打印友好(避免纯黄、纯青), (4) 符合直觉(热图用暖色,冷图用冷色)。

💻关键API速查表

获取和使用色谱

// 获取色谱
cmap = plt.get_cmap('viridis')
color = cmap(0.5) # RGBA元组
// 数值归一化
from matplotlib.colors import Normalize
norm = Normalize(vmin=0, vmax=100)
// 3D曲面
ax.plot_surface(X, Y, Z, cmap='RdYlBu_r')

自定义色谱

// 连续色谱
from matplotlib.colors import \\
LinearSegmentedColormap
cmap = LinearSegmentedColormap.from_list(
'name', ['blue', 'white', 'red'])
// 离散色谱
from matplotlib.colors import ListedColormap
cmap = ListedColormap(['r', 'g', 'b'])

📂Python代码文件

本章内容对应以下Jupyter Notebook代码文件:

BK_2_Ch06_01.ipynb颜色映射基础
BK_2_Ch06_02.ipynb三维曲面色谱
BK_2_Ch06_03.ipynb等高线色谱
BK_2_Ch06_04.ipynbRGB空间分析
BK_2_Ch06_05.ipynbHSV空间分析
BK_2_Ch06_06.ipynb自定义色谱
BK_2_Ch06_07.ipynb热图应用
📁 代码位置:books/Book2_Beauty-of-Data-Visualization/Book2_Ch06_Python_Codes/

⭐色谱选择最佳实践

✅ 推荐做法

  • • 优先使用viridis、plasma、inferno、magma
  • • 发散数据使用RdBu_r、coolwarm、seismic
  • • 周期数据使用twilight、hsv
  • • 分类数据使用tab10、Set1、Paired
  • • 打印前检查灰度效果(color.rgb_to_hsv)

❌ 避免做法

  • • 避免jet、rainbow(感知不均匀)
  • • 避免纯黄、纯青(打印时不清晰)
  • • 避免红绿组合(色盲不友好)
  • • 避免过多颜色段(视觉混乱)
  • • 避免深色背景上用深色色谱