Python数据可视化必备:Matplotlib colormap与colorbar配色全攻略

发布时间:2026/9/20 10:41:44
Python数据可视化必备:Matplotlib colormap与colorbar配色全攻略
做Python数据可视化colorbar几乎是所有人都会碰到的组件。热力图、地形图、气象云图、生物热图……凡是把连续数值编码成颜色的图一侧基本都挂着一条色带。这条色带在Matplotlib里叫colorbar背后映射颜色的结构叫colormap也就是我们常说的色表或色彩映射表。说实话我见过太多人画图时从头到尾只认一个默认色表要么就是随手选个花里胡哨的配色结果图能看但不好读数据规律被颜色的视觉偏差带偏还不自知。这篇博文就围绕Python中colorbar全色表这个话题把我这些年用过的、踩过的、总结过的东西整理出来怎么一次性看清所有内置色表、它们各自的类型和适用场景、怎么根据数据特点挑色表、怎么自定义想要的色表以及colorbar在出图环节的各种配置技巧和避坑经验。适合做数据分析和可视化的朋友也适合刚学Python绘图、想把图做得更专业的新手。1. colormap与colorbar的核心概念拆解1.1 什么是colormap它和colorbar到底是什么关系先把这个基础概念说透。colormap本质上是“数值到颜色”的映射函数输入一个数值输出一个RGB颜色。比如数据范围是0到100用viridis色表时0映射成深紫色100映射成亮黄色中间的值按比例插值出对应的颜色。colorbar则是把这个映射关系可视化出来的一根标尺。它本身不存储颜色只是把colormap的样子画在一个横条或竖条上并标上数值刻度让看图的人能根据颜色反查数据大小。所以两者是“定义”和“展示”的关系你先定好colormap画图时再用colorbar把这条映射亮出来。用生活里的例子理解colormap就像一把“温度标签贴纸”每种温度贴一种颜色colorbar就是贴在图旁边的那张“颜色-温度对照表”。数据图本身是用贴纸贴出来的对照表只是方便读者查。1.2 为什么选色表的优先级这么高很多人把配色当成画图的最后一步其实选色表应该是画图的第一步。原因在于人眼的感知特性人眼对亮度变化的感知非常敏感但对青蓝这类中间色的细微变化感知一般。如果色表里颜色变化的速度不均匀就会在数据图上制造出并不存在的“阶跃感”。最典型的反面教材是老的jet色表。jet是彩虹色蓝色到青色到绿色到黄色再到红色看起来五颜六色很热闹但它的问题很严重颜色变化速度完全不均匀蓝色和绿色区间变化很慢绿到黄区间又变化极快。这就导致同一个数值差在图的不同区域会给人完全不同的视觉冲击相当于给数据人为加了“伪等高线”。而且jet两端的深蓝和深红在灰度打印时几乎无法区分印刷出来基本没法看。后来Matplotlib团队推出了viridis等一系列感知均匀perceptually uniform的色表核心设计目标就是数值变化和视觉亮度变化尽量保持一致同时色相变化清晰让数据图更“诚实”。这也是我强烈建议新手一开始就抛弃jet、用viridis的原因。1.3 Matplotlib中colormap的组织方式Matplotlib里的colormap集中放在两个地方一是matplotlib.colormaps这个注册表对象二是matplotlib.pyplot里直接暴露出的快捷方式。你随时可以通过plt.colormaps()列出当前环境里所有可用的色表名称。比较老的写法是plt.get_cmap(viridis)现在依然能用新版本推荐直接plt.get_cmap或者从matplotlib.colormaps里取。自定义色表也能注册进去注册之后在全脚本甚至多个脚本里都能通过名字复用。提示如果你的Matplotlib版本比较老比如2.x部分新的感知均匀色表不存在。建议直接升级到3.5以上版本功能完整API也更统一。2. 内置色表全览一次看清所有colormap2.1 快速查看所有内置色表的方法在动手写数据可视化代码之前先学会把“武器库”完整看一遍。用几行代码就能把当前环境里所有colormap全部画出来import matplotlib.pyplot as plt import matplotlib.cm as cm import numpy as np cmaps_all sorted(plt.colormaps()) print(f共 {len(cmaps_all)} 个色表) gradient np.linspace(0, 1, 256) gradient np.vstack((gradient, gradient)) fig, axes plt.subplots(nrowslen(cmaps_all), figsize(6, len(cmaps_all) * 0.3)) for ax, cmap_name in zip(axes, cmaps_all): ax.imshow(gradient, aspectauto, cmapplt.get_cmap(cmap_name)) ax.set_ylabel(cmap_name, fontsize10) ax.set_xticks([]) ax.set_yticks([]) plt.tight_layout() plt.show()这段代码做的事情很简单生成一条从0到1的渐变横条然后每一行用一种色表去渲染。跑完之后你会得到一个纵向排列的“色表字典页”哪个色表长什么样一眼就能扫完。建议第一次跑的时候把图存下来之后选色表直接翻图比你一个个记忆名字高效得多。2.2 感知均匀的顺序型色表viridis家族viridis家族是目前使用最广泛的连续数据色表包括viridis、plasma、inferno、magma、cividis五个成员。它们的共同点是亮度单调变化、色相清晰、各段变化速度基本一致适合表达从低到高连续递增的数据。viridis蓝紫色到黄绿色整体偏“冷”是中性数据的万金油默认推荐。plasma深紫到亮黄色中间经过了偏橙的色调视觉冲击力更强适合想突出“高温区域”的场景。inferno纯黑到亮黄中间经过红色给人“灼热感”适合温度、能量密度这类数据。magma纯黑到粉白色中间偏紫红比inferno柔和一些适合地形、深度数据。cividis专为色觉障碍人群优化过的版本蓝灰到黄色颜色差异设计得更加保守。我在实际项目中通用热力图默认用viridis如果数据里“高值区域”特别想抓眼球就用plasma或inferno。这几个色表都是“顺序型”只适合表达单向变化的数据有正有负的数据建议往下看发散型。2.3 发散型、定性型与循环型各司其职除了顺序型Matplotlib还内置了几类定位完全不同的色表。发散型Diverging典型代表是coolwarm、RdBu、PiYG、BrBG、seismic。这类色表以中间色通常是浅色为分界向两端分别过渡到两种对比强烈的颜色适合表达“有明确零基准或中心参照”的数据比如温度正负、相关性正负、涨跌盈亏。用发散型色表时建议把中间值对齐到数据的零点这样看图时一眼就能分辨高低方向。定性型Qualitative典型代表是tab10、tab20、Set1、Set2、Set3、Pastel1等。这类色表颜色之间没有明暗递进关系只是用来区分不同类别适合散点图的分类着色、柱状图分组。千万不要用定性型去表达数值大小颜色本身没有大小含义。循环型Cyclic典型代表是twilight、hsv、twilight_shifted。这类色表的颜色首尾相接适合角度、相位、一天内时间这类循环数据比如风向角度、昼夜周期变化。2.4 常用色表速查表色表名称类型颜色特征典型应用viridis顺序型感知均匀蓝紫→黄绿通用热力图、密度图plasma顺序型感知均匀紫→橙→黄能量、强度分布inferno顺序型感知均匀黑→红→黄温度、热辐射magma顺序型感知均匀黑→紫→白地形、深度数据cividis顺序型色觉友好蓝灰→黄需要兼顾色觉障碍人群的图coolwarm发散型蓝→浅灰→红正负温度、相关性RdBu发散型红→白→蓝差异、涨跌PiYG发散型洋红→白→绿生物、实验对比tab10定性型10种离散色分类数据、分组twilight循环型彩色环形渐变角度、相位数据gray顺序型灰度黑→白灰度图、印刷图2.5 选色表前必须做的视觉检验很多人在屏幕上看着不错的色表打印出来或者投影到会议室就翻车了。我建议你在定稿前做一个简单的视觉检验把colorbar转成灰度图确认高值区和低值区仍然可以区分。from PIL import Image # 先把当前figure保存成png再用PIL打开转灰度 fig.savefig(check_cmap.png, dpi150) img Image.open(check_cmap.png).convert(L) img.save(check_cmap_gray.png)如果你发现灰度图里两个区域几乎融为一体说明这个色表的亮度对比不足。这是jet类彩虹色表最容易踩的问题也是推荐优先用感知均匀色表的原因。3. 配色选型从数据到colormap的决策思路3.1 先按数据类型确定大类拿到数据后第一步不是打开色表库翻图而是先问自己一个问题这份数据是什么类型连续数值型数据0到100的密度、温度、概率值用顺序型色表。有正负之分的数据增减百分比、相关性系数、离差用发散型色表并且让中间色对应到零点。离散分类数据不同物种、不同地区、不同组别用定性型色表。循环数据角度、方位、周期时刻用循环型色表。这一步定下来后你的选择范围就大幅缩小了不容易出现“顺序型数据配了发散型颜色”这种原则性错误。3.2 结合具体图表类型微调同样是连续数据在热力图、等高线图、散点图里选色表的要求也会有差异。比如imshow热力图最看重颜色辨识度一般用viridis或magma这类感知均匀色表。等高线图contourf如果层级很多建议选用颜色等级数量较少的色表层级之间对比会更清晰或者用levels参数把连续渐变离散成若干个等级。而密度散点图里由于大量点会叠加在一起可以配合alpha透明度使用让色表的暗部也能看出点密度变化。3.3 考虑色觉障碍、灰度打印和期刊要求选色表不只是审美问题还涉及可读性。全球大约有8%的男性和0.5%的女性存在不同程度的色觉障碍红绿色盲最常见。如果你的图表面向大众传播尽量避免使用红绿对比强烈的配色改用cividis这类专门优化的色表或者用“红蓝”“橙蓝”这类区分度更高的组合。另外学术论文和正式报告经常有黑白打印的需求。发散型色表RdBu在灰度图下两个方向会变得几乎一样这种情况建议改用coolwarm它的亮度变化更符合人眼习惯灰度打印后依然能从深到浅区分正负。注意很多期刊现在明确不推荐使用jet、rainbow这类彩虹色表。投稿前建议先查一下目标期刊的作图规范不少期刊在作者指南里写了推荐色表。3.4 常用场景推荐清单应用场景推荐色表说明通用热力图viridis默认首选无脑安全温度分布inferno / plasma暖色系更有“温度感”地形高程terrain / magmaterrain有自然感magma更现代相关性矩阵RdBu / coolwarm中间色对应0相关涨跌对比RdBu / PiYG红涨绿跌或蓝涨红跌分类散点tab10 / Set2颜色数量少且区分度好概率密度cividis / viridis色觉友好打印稳定夜间灯光/卫星图inferno深色底配合亮色高值相角/风向twilight首尾相接循环无断层4. 自定义colormap构建属于自己的色表4.1 用LinearSegmentedColormap快速做渐变Matplotlib内置色表再全也总有不够用的时候。比如公司VI色、论文统一色系、项目专属配色都需要自定义色表。最简单的方案是用LinearSegmentedColormap.from_list从一个颜色列表生成线性渐变映射。import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap import numpy as np # 从两个颜色渐变 my_cmap LinearSegmentedColormap.from_list(blue2orange, [#1a5276, #f39c12]) # 从多个颜色渐变可以精确控制中间点 my_cmap_multi LinearSegmentedColormap.from_list( brand_cmap, [(0.0, #2c3e50), (0.3, #2471a3), (0.6, #e67e22), (1.0, #f1c40f)] ) data np.random.rand(10, 10) * 100 fig, axes plt.subplots(1, 2, figsize(10, 4)) im0 axes[0].imshow(data, cmapmy_cmap) axes[0].set_title(Two-color gradient) fig.colorbar(im0, axaxes[0]) im1 axes[1].imshow(data, cmapmy_cmap_multi) axes[1].set_title(Multi-stop gradient) fig.colorbar(im1, axaxes[1]) plt.tight_layout() plt.show()from_list的妙处在于你完全不用关心插值算法只要给出锚点颜色它会自动在颜色之间做平滑过渡。如果你想控制某个中间颜色出现的位置可以在列表里传入(位置, 颜色)元组位置取0到1的浮点数。4.2 用ListedColormap做离散色带当数据本身是离散等级比如地质灾害风险等级低、中、高、极高或者成就等级青铜、白银、黄金用连续渐变反而会让等级边界变模糊。这时候用ListedColormap更合适它直接指定每个等级用什么颜色。from matplotlib.colors import ListedColormap, BoundaryNorm import matplotlib.pyplot as plt import numpy as np # 定义4个等级的颜色 colors [#d4e6f1, #aed6f1, #3498db, #1a5276] cmap_discrete ListedColormap(colors) # 定义数值边界 bounds [0, 25, 50, 75, 100] norm BoundaryNorm(bounds, cmap_discrete.N) data np.random.rand(8, 8) * 100 fig, ax plt.subplots(figsize(6, 5)) im ax.imshow(data, cmapcmap_discrete, normnorm) cbar fig.colorbar(im, axax) cbar.set_ticks([12.5, 37.5, 62.5, 87.5]) cbar.set_ticklabels([低, 中, 高, 极高]) plt.show()这里有个非常关键的细节BoundaryNorm负责把数值范围按照bounds切分成离散区间然后每个区间用cmap_discrete里的一个颜色。如果不引入BoundaryNormMatplotlib会默认把min到max的值均匀映射到颜色列表结果就是颜色分界和你的业务等级对不上。4.3 色表注册与复用自定义好色表后如果只在一个脚本里用直接作为参数传入cmap即可。如果你想在整个项目、多个脚本甚至多个项目里复用最好把它注册到Matplotlib的全局注册表中。import matplotlib as mpl from matplotlib.colors import LinearSegmentedColormap # 自定义并注册 cmap_brand LinearSegmentedColormap.from_list(brand, [#003f5c, #7a5195, #ef5675, #ffa600]) mpl.colormaps.register(cmap_brand, forceTrue) # 注册后直接按名字调用 plt.imshow(data, cmapbrand)注册之后plt.colormaps()列表里就会出现brand这个名字。forceTrue参数表示如果已有同名色表则强制覆盖避免重复注册时报错。4.4 进阶技巧从图片中提取色板有时候看到一张漂亮的图想把它的配色搬到自己的制图里。可以写个小工具把图片中的关键颜色提取出来然后生成渐变。from PIL import Image import numpy as np from matplotlib.colors import LinearSegmentedColormap def extract_colors_from_image(path, num_colors8): img Image.open(path).convert(RGB) img_small img.resize((100, 100)) data np.array(img_small).reshape(-1, 3) # 简单采样也可以用KMeans聚类提取更有代表性的颜色 indices np.linspace(0, len(data) - 1, num_colors, dtypeint) sampled data[indices] / 255.0 return sampled colors extract_colors_from_image(reference.png, num_colors8) cmap_img LinearSegmentedColormap.from_list(img_cmap, colors)如果图片颜色比较杂建议用KMeans聚类提主色这里只是给一个最简单的思路。提取出的色表通常可以直接用于数据可视化而且风格上会和原图保持一致。5. colorbar实操配置从基础到美化5.1 最基础的colorbar接入方式使用colorbar最常见的方式是fig.colorbar(mappable)其中mappable是带有颜色映射对象的绘图结果比如imshow的返回值、contourf的返回值或者scatter的返回值。import matplotlib.pyplot as plt import numpy as np data np.random.rand(10, 10) fig, ax plt.subplots(figsize(6, 4)) im ax.imshow(data, cmapviridis, vmin0, vmax1) cbar fig.colorbar(im, axax) cbar.set_label(Value) plt.show()这里有个新手容易踩的坑imshow必须显式赋值给某个变量比如im否则fig.colorbar()找不到映射对象会直接报错No mappable was found to use for colorbar creation。顺便说一句vmin和vmax这两个参数用来控制颜色映射的数值范围不写的话Matplotlib会把数据的最小最大值当范围。5.2 控制位置、尺寸和方向colorbar默认贴在图的右侧是一个竖直条。但有些时候图例放在底部、或者需要缩小一点才好看。这就用到shrink、aspect、pad、fraction这几个参数。fig, ax plt.subplots(figsize(6, 4)) im ax.imshow(data, cmapcoolwarm) cbar fig.colorbar(im, axax, orientationhorizontal, shrink0.8, aspect30, pad0.15, extendboth)参数说明orientationvertical或horizontal横放还是竖放。shrinkcolorbar相对默认长度的比例0.8表示缩短到80%。aspectcolorbar的长宽比值越大条越细长。padcolorbar与主图之间的间距。extend在colorbar两端加箭头表示数据超出映射范围常用both、min、max。extend这个参数在数据到顶或到底的情况非常实用。比如你的数据里有一部分值超过了你所设定的vmax颜色会集中在最深色那块但你不确定它到底超了多少。加上extendmax后colorbar顶端会出现一个小箭头明确告诉读者“这里的数据比色表最深的颜色还要大”。5.3 刻度、文字和字体的细节处理colorbar上经常需要调整刻度位置、刻度标签的文字内容、字号大小以及单位的显示。操作入口是cbar.set_ticks、cbar.set_ticklabels和cbar.set_label。import matplotlib.pyplot as plt fig, ax plt.subplots(figsize(6, 4)) im ax.imshow(data, cmapcoolwarm, vmin-1, vmax1) cbar fig.colorbar(im, axax, shrink0.85, pad0.1) cbar.set_label(Correlation, fontsize13) cbar.set_ticks([-1.0, -0.5, 0.0, 0.5, 1.0]) cbar.set_ticklabels([-1.0, -0.5, 0, 0.5, 1.0], fontsize11) cbar.ax.tick_params(width1.5, length5) plt.show()这里补充一个细节colorbar本身是一个坐标轴对象通过cbar.ax可以像操作普通坐标轴一样去控制它。比如刻度方向、刻度线长度、甚至背景颜色都可以调整。cbar.outline可以控制外框线。如果你的数据是百分比或者带科学计数法的数字可以配合FuncFormatter做一些更复杂标签格式化。from matplotlib.ticker import FuncFormatter def k_format(x, pos): return f{x/1000:.0f}K cbar.ax.yaxis.set_major_formatter(FuncFormatter(k_format))5.4 多子图共享一个colorbar四个子图画在同一行如果每个子图都自带一个colorbar版面会非常挤而且它们范围相同的话完全是浪费。更专业的做法是整个figure只用一个colorbar。import matplotlib.pyplot as plt import numpy as np fig, axes plt.subplots(1, 4, figsize(12, 3)) data_list [np.random.rand(5, 5) for _ in range(4)] for ax, d in zip(axes, data_list): im ax.imshow(d, cmapviridis, vmin0, vmax1) fig.colorbar(im, axaxes, shrink0.8, aspect30) plt.show()关键点在于axaxes把多个axes对象以列表形式传给fig.colorbarMatplotlib会自动把colorbar放在这几张子图的公共区域并且按照整行图的宽度定位。如果四个子图数据范围不同或者希望它们共享色表但各自颜色范围不同可以通过给每个子图传不同的vmin/vmax实现但那样就不适合共用一个colorbar了。另一种更灵活的做法是手动创建colorbar专属axes。缺点是定位需要自己调但排版自由度最高。import matplotlib.pyplot as plt fig, ax plt.subplots(figsize(6, 4)) im ax.imshow(data, cmapplasma) # 在figure右侧手动创建一个新的axes cax fig.add_axes([0.92, 0.15, 0.03, 0.7]) # [left, bottom, width, height] cbar fig.colorbar(im, caxcax)手动创建axes的好处是可以放在任意位置也可以精确控制大小。缺点是没有自动避让主图需要自己调坐标值。5.5 与seaborn、plotly等库的联动除了Matplotlib原生colorbar很多基于Matplotlib的库也继承了色表体系。seaborn的heatmap就支持cmap参数底层同样调用Matplotlib colorbar。plotly则有自己的colorscale体系但配色思路一模一样。import seaborn as sns sns.heatmap(data, cmapcoolwarm, center0, annotTrue) plt.show()注意center参数在seaborn的heatmap里设置center0后色表的中间色会自动对齐到0值这正是发散型色表最想要的效果。如果画的是涨跌幅数据center0基本是必加的。plotly里则用colorscaleViridis类似的写法名字不完全一样但思路一致。如果你在Matplotlib里自定义了一个色表想用到plotly里可以把它导出成颜色列表然后传给plotly。6. 常见问题排查与避坑实录6.1 报错No mappable was found to use for colorbar creation这个报错出现频率极高主要原因是fig.colorbar()没有找到可映射的对象。常见场景有两种一是imshow、scatter、contourf的返回值没有赋给变量二是你调用了plt.colorbar()但当前没有“活跃”的绘图对象。解决思路很简单把绘图结果赋值给变量再传入fig.colorbar(变量)。如果你用的是plt.colorbar()这种直接调用方式改成fig.colorbar(im, axax)的显式写法报错基本就消除了。6.2 colorbar的颜色范围和数据对不上有时数据最大值明明是10但colorbar显示到12颜色发白或者颜色很深看起来图“偏了”。原因通常是vmin、vmax没有手动设置或者数据里包含NaN值。处理方式在imshow、contourf等函数里显式传入vmin和vmax如果是发散型色表还可以用normTwoSlopeNorm把中心值固定到业务零值。from matplotlib.colors import TwoSlopeNorm norm TwoSlopeNorm(vmin-50, vcenter0, vmax100) im ax.imshow(data, cmapRdBu_r, normnorm)TwoSlopeNorm在气象、金融等需要强调正负分界的场景特别常用它可以让正负两侧的颜色深浅比例根据实际数据范围自动调整。6.3 离散色带的颜色顺序和预期相反这个问题常出在用ListedColormap定义离散等级的时候。默认情况下imshow会把数组里小的数值映射到色表的前面颜色大的数值映射到后面的颜色。如果你的等级是“低风险浅色、高风险深色”但图上显示反了多半是色表顺序没调对。检查方法是cmap颜色列表里第一个颜色对应的是最小值。如果你希望数值大对应深色就把深色放在列表最后如果想整体反转用cmap.reversed()或者颜色名加_r后缀。6.4 中文标签和负号乱码Matplotlib默认字体不支持中文显示colorbar的set_label如果写了中文出来就是方框。常见解决方案是设置系统支持的中文字体。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, PingFang SC] plt.rcParams[axes.unicode_minus] False其中axes.unicode_minus设置为False是为了解决坐标轴负号显示为方块的问题。字体设置建议放在脚本开头全局生效。如果你在公司内网或服务器上跑代码没有中文字体也可以用英文标签绕过去。6.5 常见问题速查表问题典型原因解决方案colorbar报No mappable绘图对象没赋值用im ax.imshow(...)再fig.colorbar(im, axax)颜色范围整体偏移vmin/vmax未设置显式传入vmin、vmax正负数据中间色不在零点N/A用TwoSlopeNorm(vcenter0)离散等级颜色顺序相反色表顺序和理解相反反转色表或用_r后缀colorbar太长/太粗默认布局比例不合适调整shrink、aspect参数中文乱码缺少中文字体配置设置rcParams[font.sans-serif]保存的图颜色暗淡dpi或色彩空间问题savefig(dpi300)并考虑cbar颜色映射范围多子图共享色条时位置不对使用了错误参数fig.colorbar(im, axaxes)或者手动创建cax6.6 环境准备装好Matplotlib再动手开头提到Python可视化绕不开环境配置。如果你连import matplotlib这一步都没过先解决依赖库安装问题。在终端或命令行里运行pip install matplotlib numpy如果你是Python新手遇到pip不是内部命令说明可能需要用python -m pip替代。装完后在Python交互环境运行import matplotlib; print(matplotlib.__version__)确认安装成功。日常画图建议在Jupyter Notebook、VS Code或PyCharm里做配合交互式窗口调试colorbar参数非常方便。提示如果你在安装过程中遇到“pip is being used”之类提示说明有外部环境管理工具在管Python包不要强制--force-reinstall先确认你是不是在虚拟环境里操作。虚拟环境是Python项目的最佳实践能隔离不同项目的依赖避免版本冲突。写在最后的一些个人习惯做可视化这些年我自己的配色习惯逐渐固定成一套流程先想清楚数据是“顺序、发散、分类还是循环”再定大类然后根据使用场景屏幕、打印、投影微调色表最后自定义风格统一的项目色表并注册复用。快速出图默认viridis有正负分界用coolwarm分类数据用tab10几乎覆盖了九成需求。还有一个习惯特别想推荐把色表的选择和你日常绘图封装的函数绑定。比如我写了一个通用的热力图函数内部默认用viridis但通过cmap参数暴露给调用方。这样团队里其他人画图时哪怕不关心配色也能拿到一个合理的结果想深究的人也有充分的自定义空间。最后再分享一个小技巧当你纠结两个色表哪个效果更好时别只看脚本输出保存成PNG发到手机上看一眼。屏幕显示、微信预览、打印输出三个渠道各看一遍哪个色表在三种媒介下都清晰就选哪个。视觉信息的可传递性永远比色表本身好不好看更重要。