返回 HackerTubeYouTube2026年11月13日视频时长:19:08

如何设计一张更好的默认色图

A Better Default Colormap for Matplotlib | SciPy 2015 | Nathaniel Smith and Stéfan van der Walt

EEnthought

完整字幕

中文
查看原视频
本篇目录

默认色图会改变读者看到的东西

查看原文 00:28

色图把每个数值映射为一种颜色,让一片数字中的结构变得可见。但这个映射也是数据与读者之间的接口:如果颜色变化在视觉上不均匀,它就可能突出一些边界,而这些边界并不对应同等重要的数据变化。在 SciPy 2015 上,Nathaniel Smith 介绍了他与 Stéfan van der Walt 的工作,主张用围绕人类感知设计的色图替换 Matplotlib 的默认色图 Jet。

查看原图

Smith 介绍了一项针对心脏病影像诊断工具的用户研究:据他描述,与比较中较好的色图相比,习惯使用 Jet 的医生用时约为两倍,诊断错误也更多。他推测这样的默认设置可能害过人。这是讲者的猜测,不是演讲中证明 Jet 导致死亡的证据;演讲也没有确立临床结局。幻灯片将该研究标为 Borkin 等人(2011)。从 00:58 观看。

查看原图

Smith 认为 MATLAB 当时较新采用的 Parula 比 Jet 好得多,但表示他们无法使用它。于是团队决定自行设计一种可开放使用的替代方案。

通用默认色图需要有序且易辨的变化

查看原文 02:42

选择默认值时,设计者还不知道用户的数据是什么。Smith 提出的起始标准是:色图应色彩丰富、足够美观,让人愿意使用;应当是顺序色图、感知变化一致;也应适合黑白呈现,并尽可能照顾更多读者。顺序色图表示从低到高的有序变化;数据每变化相同的量,视觉上也应大致变化相同的程度。

查看原图

这并不意味着顺序色图适合所有任务。发散色图可以强调数值在某个有意义中心两侧的偏离;循环色图可以连接重复量的两端。这些选择都对数据结构有所假设,而通用默认值无法预先知道这些结构。从 02:42 观看。

光谱经过压缩才成为视觉信号

查看原文 04:00

要为感知而设计,可以沿着这条链条理解:数据变成 RGB 数值,显示器发出光,视网膜作出反应,大脑再产生视觉体验。Smith 把它作为一个有用的模型,并不声称它完整解释了视觉。

大多数光是许多波长的混合,可以用各波长所含光量组成的光谱来描述。接近单一波长的激光则是较简单的例子。在演讲的简化模型中,分别对长、中、短波长敏感的三类视锥细胞,把高维输入转成三个信号。不同光谱可能产生相同的三组反应,因此它们之间的差别会在这一表示中消失。

查看原图

XYZ 同时解释光的混合与显示器的限制

查看原文 05:56

CIE XYZ 为三维颜色匹配空间提供坐标:在上述简化模型中,一个点可以代表产生等效反应的多种光谱。由于真实光谱不可能在某个波长上含有负数的光,数学空间中只有一部分可以实现。Smith 展示了这个锥形区域的一个切面,以解释常见的彩色形状。

查看原图

光的混合在这个映射中是线性的:红光与绿光的混合落在两点之间,并可能呈现黄色。显示器也以类似方式混合三种基色。它们能够组成的颜色构成显示器的色域;超出色域的路径无法直接按预期显示。编码后的显示信号与发光量之间是非线性关系,这与人类感知本身的非线性是两回事。从 05:56 观看。

感知空间在具体环境中估计颜色外观

查看原文 09:06

进入眼睛的光不能唯一决定看到的外观。视觉会适应周围照明:Smith 展示的裙子图中,裙子的像素相同,却因为周围颜色不同而看起来不同。因此,模型会考虑参考白点和观看条件,而不是把实际进入眼睛的光直接等同于感知亮度。

查看原图

Smith 对比了 CIELAB 与 CIECAM02:前者是 1976 年的模型,部分目标是用距离估计颜色相似度;据他介绍,后者对色相等属性的描述更好,但本身不是距离模型。团队使用的 CAM02-UCS 由 CIECAM02 变换而来,目的是同时让距离也具有实用意义。这些都是拟合得到的近似,并非对大脑的真实模拟,也不能保证适用于所有观看条件。

查看原图

无障碍设计需要检查多种观看方式

查看原文 12:11

Smith 解释说,常见的色觉差异可能使长波与中波视锥细胞的反应更加相似,或者使其中一种缺失。在他的简化示意中,这会压缩红绿轴上的许多差异。因此,如果色图只依靠这些差异传达信息,一些读者就可能更难看懂。

团队的工具提供了几种色觉状况的近似模拟和灰度视图。这些模拟是设计辅助,并非对每个人视觉体验的精确复现。灰度也是一项独立需求:图表打印后,即使色相消失,读者仍应能辨认有序变化。从 12:11 观看。

比较色图时要看感知变化的速度

查看原文 13:11

可视化工具按相同的数据间隔对色图取样,把样本画在感知空间中,并绘制类似导数的感知变化速率曲线。在该模型下,理想的均匀色图应有一条平坦的速率曲线。Jet 的视图显示出很大的波动,旁边还有示例图、色觉模拟和灰度结果。

查看原图

演讲中 Parula 看起来均匀得多,但 Smith 指出它仍有一条可见色带,并提醒观众比较图表的坐标尺度。他把部分差异归因于模型:据他介绍,Parula 按 Lab 空间中的均匀性设计,而团队选用的空间对相近颜色差异的估计不同。这是讲者基于模型的解释,不能据此证明某张色图在所有情境中都最好。

查看原图

循环数据需要另一条颜色路径

查看原文 14:32

同一套工具也可以反过来使用:先在感知坐标中选择路径,再将其转换为显示颜色。Smith 设计循环色图时,固定明度,在另外两个维度组成的平面上画圆。路径终点与起点相接,正好适合 0° 和 360° 附近彼此相邻的方向数据。

查看原图

在风向示例中,相邻颜色有助于看出方向变化和可能的风切变。关键是让色图符合数据结构:循环变量适合闭合路径,而结构未知的有序变量更适合以顺序色图作为起点。从 14:32 观看。

贝塞尔控制点把约束变成候选色图

查看原文 15:08

团队为顺序默认色图优先选择蓝黄方向,以减少对红绿差异的依赖;同时让颜色由暗变亮,以便在灰度中保留顺序。Smith 解释说,可用颜色空间的形状使深蓝到浅黄比深黄到浅蓝更可行。即便如此,设计者仍可选择经过哪些中间颜色。

查看原图

他们的编辑器确定起点和终点的明度后,让设计者在二维视图中拖动贝塞尔控制点,也就是调整平滑曲线形状的手柄。团队一边调整路径,一边检查可用色域的不同切片。这样就能在反复设计中同时考虑期望的感知变化、显示限制和视觉效果。

查看原图

Viridis 来自多个候选方案和加入绿色的建议

查看原文 16:40

团队最初制作了三个候选方案,并在 Matplotlib 邮件列表上征求意见。Smith 开玩笑说,快速设计色图反而让选择更困难:每个人都可能对“自行车棚应该刷什么颜色”发表意见。后来 Eric Firing 建议加入绿色。随后出现了另一个候选方案,团队又对其作了调整;字幕没有明确说明该方案的设计者。Smith 笑称,他们最初遗漏的标准就是必须有绿色。

查看原图

最终提出的方案叫 Viridis。Smith 表示,与 Parula 相比,它的明度变化更大、色相变化更小,而且团队的模型避开了他指出的折弯。加入绿色的建议和他的偏好体现了技术约束之内的审美选择,并不是说所有色图都必须包含绿色。从 16:40 观看。

发布安排是 2015 年的历史计划

查看原文 17:56

演讲时,Smith 表示团队计划在下一个版本中提供这些候选色图,并希望为 Matplotlib 2.0 选出新的默认值;当时预计该版本将在几个月后发布。他还邀请听众参加次日关于默认设置的讨论。这些都是 SciPy 2015 当时的计划和表述,本文不据此断言后续实际发布情况或当前默认值。

实践中的要点是根据数据和受众选择色图:检查它在感知空间中的变化、查看灰度与模拟视图、尊重显示器色域,并在数据需要时选用循环或发散色图。默认值只是起点,值得像其他任何界面一样接受检验。