4. 定性数据配色策略
在科研图表中,定性数据(也称分类数据)指的是取值之间没有大小顺序、只有类别归属的变量,例如实验分组(对照组、处理组A、处理组B)、细胞类型、材料种类、采样站点、算法模型等。与连续型数据可以用同一条色带的明暗或冷暖渐变来表达数值高低不同,定性数据配色的首要任务是让读者一眼分清“谁是谁”,而不是暗示“谁大谁小”。因此,定性配色的核心原则可以概括为:类别之间差异足够大、类别内部含义稳定、不引入误导性的顺序或情感联想。
一、类别区分:先保证可分辨,再谈美观
类别区分的下限是“可分辨”,上限是“不混淆”。判断一组颜色是否合格,不能只看屏幕上的观感,还要考虑三个现实约束:色觉障碍读者、黑白打印、以及多类别同时出现时的拥挤程度。一个实用的经验是:类别数不超过 8 时,尽量使用色相差异明显的颜色;超过 8 类时,应优先考虑分组、分面或直接标注,而不是继续往色板里塞颜色。
可分辨性还体现在“相邻类别”的对比上。图例中相邻的两个色块如果色相接近、明度也接近,读者在图中来回对照时就容易出错。因此选色后应做一次“相邻检查”:把色板按顺序排开,观察每一对相邻颜色在缩小到图例尺寸时是否仍能区分。对于柱状图、折线图这类类别沿坐标轴排列的图形,相邻类别的颜色差异尤其重要。
二、色相选择:用“语义中性”的颜色承载类别
色相本身带有文化和情感联想:红色常被理解为警示、错误或“高值”,绿色常被理解为正常、通过或“低值”,蓝色则相对中性。当类别本身没有好坏之分时,应尽量避免让某个类别天然显得“特殊”。例如把“对照组”设为灰色、把“处理组”设为红色,读者会下意识认为处理组代表异常或危险;如果研究结论并不支持这种暗示,就构成了歧义色。
避免歧义色的具体做法有三条。第一,慎用红绿对立:红绿色觉障碍是最常见的色觉异常类型,红绿搭配在部分读者眼中几乎无法区分,若必须表达两类对比,可改用蓝—橙组合。第二,避免用彩虹色表达无序类别:彩虹色(如 jet 色带)明度变化不规律,既不适合定性数据,也容易让读者误以为存在顺序。第三,保持语义一致:同一篇文章、同一组图中,同一类别应始终使用同一颜色,跨图复用时不要随意更换色板,否则读者需要重新建立映射关系。
三、常用定性色板:Set1、Dark2 的适用场景
在 R 的 RColorBrewer、Python 的 matplotlib/seaborn 以及各类绘图工具中,内置了一批经过设计的定性色板。它们并非可以随意互换,而是各有适用场景。
| 色板 | 典型类别数 | 视觉特征 | 适用场景 | 注意事项 |
|---|---|---|---|---|
| Set1 | 最多 9 类(常用 5~8 类) | 饱和度高、色相跨度大、鲜艳醒目 | 类别少、需要强区分的柱状图、散点分组、海报或幻灯片 | 颜色偏艳,正式期刊印刷时可能显得刺眼;红绿同时出现需谨慎 |
| Dark2 | 最多 8 类(常用 4~6 类) | 明度较低、饱和度适中、沉稳 | 正式论文插图、折线图、需要长时间阅读的图 | 整体偏暗,深色背景或小尺寸图例中对比度可能不足 |
| Paired | 成对使用,最多 12 色(6 对) | 每对深浅搭配,对内有明度关系 | 存在“配对”结构的类别,如处理前/处理后、野生型/突变型 | 对与对之间需检查是否混淆;不适合完全无序的类别 |
| Set2 / Set3 | Set2 最多 8 类,Set3 最多 12 类 | 柔和、低饱和、粉彩感 | 类别较多、希望整体柔和的示意图或综述图 | 类别多时相邻颜色差异变小,需配合标记形状或直接标注 |
选择时可以先问两个问题:这张图最终出现在哪里(屏幕汇报还是印刷论文)?类别之间是否存在配对或分组结构?前者决定饱和度和明度取向,后者决定是否使用 Paired 这类成对色板。若类别数超过色板上限,不要循环取色,而应改用“颜色 + 形状/线型/填充纹理”的双重编码,或把次要类别合并为“其他”。
四、调整方法:从“拿来即用”到“按需微调”
内置色板是起点而非终点。实际制图中常见的调整包括:删减颜色(类别少于色板容量时,按顺序取前 N 个,但要注意前几个颜色是否恰好包含红绿对立)、调整明度(印刷前把过亮的颜色压暗,保证灰度下仍可区分)、替换歧义色(把语义过强的红色替换为紫色或棕色)、以及固定映射(在代码中显式指定“类别名→颜色”的字典,避免不同图之间自动分配导致颜色漂移)。
下面是一段 Python 示例,演示如何固定类别与颜色的映射,并对 Set1 做一次“去红绿对立”的替换。示例中的类别与颜色仅为教学假设,实际使用时按自己的数据替换。
import matplotlib.pyplot as plt
import seaborn as sns
# 固定映射:类别名 -> 颜色,保证多张图颜色一致
group_colors = {
"对照组": "#4C72B0", # 蓝
"处理组A": "#DD8452", # 橙
"处理组B": "#55A868", # 绿
"处理组C": "#8172B3", # 紫
}
# 若直接取 Set1 前 4 色,会得到红、蓝、绿、紫,红绿相邻易混淆
set1 = sns.color_palette("Set1", 4)
print([c for c in set1]) # 观察实际取到的颜色再决定是否替换
# 绘图时显式传入映射,避免自动分配
for name, color in group_colors.items():
plt.scatter([], [], color=color, label=name)
plt.legend()
plt.show()
调整完成后,建议做一次“成品检查”:把图缩小到论文栏宽(约 8~9 cm)、转灰度、并模拟红绿色觉障碍(多数绘图软件和在线工具有对应预览),确认每个类别仍能被唯一识别。若某两个类别在任一检查下无法区分,就回到色板重新选色,而不是靠加粗图例文字来补救。
最后需要强调,定性配色的“正确”不是唯一的,而是在可分辨、无语义误导、跨图一致这三条约束下自洽。同一篇论文中,若图 1 用蓝色表示对照组,图 3 就不应再用蓝色表示处理组;若期刊要求灰度印刷,就应在投稿前完成灰度可读性检查。把颜色映射写成显式字典、把检查步骤固定进制图流程,比反复凭感觉调色更能保证出版质量。