🎨 章节概览
颜色映射(Colormap)是数据可视化的核心工具,它定义了从数值到颜色的映射规则。 Matplotlib提供178个内置色谱,涵盖顺序型、发散型、循环型等多种类型。 本章将系统学习色谱的选择、应用、空间位置分析,以及如何创建自定义色谱。
革命性交互体验
通过直接操作理解色谱-数据匹配原则
💡 学习目标:在实验室中切换数据类型和色谱,实时观察适配性评分和智能建议。 通过"做中学"建立色谱选择的直觉,理解为什么某些组合有效,某些会产生误导。
🎨 色谱实验室(Colormap Lab)
通过直接操作理解色谱类型与数据类型的匹配关系
数据类型选择
🧪 探索建议
- • 切换不同数据类型,观察哪些色谱更合适
- • 注意发散型数据的中心值如何被突出
- • 观察循环型数据的首尾连续性
- • 尝试"错误"搭配,理解为什么不合适
选择色谱
💡 关键洞察
📚 色谱-数据匹配原则
- • 温度数据 → viridis(顺序型)
- • 偏差数据 → RdBu_r(发散型)
- • 角度数据 → twilight(循环型)
- • 类别数据 → tab10(分类型)
- • 数据特性:单调/对称/周期/离散
- • 感知均匀性:viridis优于jet
- • 色盲友好:避免红绿组合
- • 打印友好:避免纯黄纯青
- • 顺序数据用发散色谱 → 中心被误导性强调
- • 循环数据用顺序色谱 → 产生伪边界
- • 分类数据用连续色谱 → 暗示不存在的顺序
- • 使用jet/rainbow → 感知不均匀,色盲不友好
- • 灰度测试:转为灰度看感知是否均匀
- • 色盲模拟:使用工具检查可访问性
- • 打印预览:检查打印效果
- • 用户测试:询问他人理解是否正确
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()颜色映射基础
Matplotlib Colormaps · 178个内置色谱
Matplotlib提供了丰富的内置色谱库,包括Sequential(顺序型)、Diverging(发散型)、Cyclic(循环型)等多种类型。 每种色谱都有其特定的应用场景和感知特性。理解色谱的分类和使用方法是数据可视化的基础技能。
6.1 颜色映射探索器(Colormap Explorer)
探索Matplotlib的178个内置色谱,理解数值到颜色的映射关系
数值 → 颜色映射
🎨 探索建议
- • 点击下方色谱卡片,切换不同的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))用指定色谱绘制三维网格曲面
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²)色谱选择
用指定色谱绘制等高线
Contour · 填充与非填充模式
等高线图有两种模式:contourf()填充模式展示连续的色彩过渡, 适合表现温度、高度等连续变量;contour()非填充模式只绘制等高线, 常用于叠加到其他图形上。不同色谱会产生截然不同的视觉效果。
6.3 等高线色谱(Contour Colormap)
使用色谱绘制填充/非填充等高线
色谱选择
💡 使用场景
- • 填充等高线:contourf(),适合展示连续变化
- • 非填充等高线:contour(),适合叠加到其他图上
- • 气象图、地形图、热力图常用此方式
可视化色谱在色彩空间位置
RGB & HSV · 色谱轨迹分析
每个色谱实际上是RGB立方体或HSV圆柱中的一条曲线轨迹。 通过三维可视化色谱的色号位置,可以理解不同色谱的空间特性:viridis是感知均匀的轨迹,rainbow/jet是绕RGB立方体的螺旋,hsv是HSV圆柱的完整环形。这种分析有助于理解色谱的感知特性。
6.4 & 6.5 色谱在色彩空间中的位置
可视化色谱在RGB立方体和HSV圆柱中的轨迹
色谱选择
🔍 观察要点
- • RGB空间:色谱是立方体内的曲线轨迹
- • HSV空间:色谱在圆柱坐标中展示
- • 不同色谱有不同的空间特性和感知均匀性
自定义色谱
Custom Colormap · LinearSegmentedColormap
使用LinearSegmentedColormap.from_list()可以创建自定义色谱。通过指定颜色节点和位置, 系统会自动在节点之间进行线性插值。节点可以均匀分布,也可以不均匀分布。 不均匀节点的色谱可以强调特定数值范围,如离群值检测。
6.6 自定义色谱构建器(Custom Colormap Builder)
使用LinearSegmentedColormap创建自定义连续色谱
预设方案
🎨 色谱设计原则
- • 均匀节点:适合对称数据(如偏差)
- • 不均匀节点:强调特定范围(如离群值)
- • 循环色谱:首尾颜色相同,用于周期数据
- • 白色中心:适合发散型数据,0值显示为白色
颜色节点
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) - • 节点之间使用线性插值
- • 品牌色定制热力图
- • 科学可视化(特定颜色表示特定含义)
- • 提升数据可读性
使用自定义色谱绘制热图
Heatmap · 连续vs离散色谱
热图(Heatmap)是色谱最常见的应用场景。使用seaborn.heatmap()可以快速绘制热图。本节对比三种色谱类型:连续色谱(均匀节点)适合对称数据,连续色谱(不均匀节点)强调离群值,离散色谱用于区间分类。 理解这些差异有助于选择合适的色谱。
6.7 热图色谱应用(Heatmap with Custom Colormap)
使用自定义色谱绘制热图,展示标准正态分布随机数
色谱类型
📊 数据统计
💡 设计要点
- • 5个颜色均匀分布在[0, 1]
- • 白色位于中心(0.5),对应数值0
- • 适合对称数据可视化
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速查表
获取和使用色谱
自定义色谱
📂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(感知不均匀)
- • 避免纯黄、纯青(打印时不清晰)
- • 避免红绿组合(色盲不友好)
- • 避免过多颜色段(视觉混乱)
- • 避免深色背景上用深色色谱