推荐的配色方案以及如何自定义它们
处理序列数据时,清晰一致的颜色非常重要:它们可以帮助读者快速区分状态,并在不同图表之间进行比较。在 Sequenzo 中,这种逻辑直接内置于 SequenceData 类中。我们不需要将颜色选择分散到不同的可视化函数中,而是在工作流程的初始阶段就将控制权集中化。
具体来说,在创建 SequenceData 对象的那一刻,每个状态都会被分配一种独特的颜色。这意味着无需调整各个绘图函数;一旦设置了映射,每个图表都会自动继承该颜色。要自定义方案,只需定义您的 states、其易于理解的 labels,以及(可以根据自己的意愿选择)一个 custom_colors 列表即可。这样,SequenceData 便可作为颜色处理的唯一来源,确保所有分析的一致性。
这种设计有两个优点:
- 它能够使代码保持简洁:只需声明一次状态及其颜色。
- 它保证了可重复性:无论生成哪种可视化,相同的状态在不同的可视化中始终会通过相同的颜色显示。
因此,即使在复杂的项目中,序列图仍然能够保持直观和连贯。
默认颜色
如果未指定custom_colors,Sequenzo 会根据数据中的状态数自动分配颜色:
- ≤20 个状态:使用Spectral调色板(反转显示以提高可读性)
- 21-40 个状态:使用viridis调色板(色彩丰富且感知均匀)
- >40 个状态:使用组合调色板(viridis + Set3 + tab20,以实现最大多样性)
调色板会一次性应用于所有状态,而不是分段应用。例如,如果您有 30 个状态,则所有 30 个状态都会使用 viridis 调色板,而不是前 20 个使用 Spectral,其余 10 个使用 viridis。
⚠ 实用建议:我们强烈建议不要使用超过 15 种状态,因为 10 种状态就已经让可视化变得非常拥挤,并且难以解读。如果状态过多,即使是最好的调色板也无法确保不同序列模式之间清晰的视觉区分。
以下是默认调色板的外观,它们(光谱、绿色、组合)对色盲用户友好:
光谱调色板(≤20 个状态,反转)
Viridis 调色板(21-40 个状态)
组合调色板 (>40 状态)
缺失值
缺失值总是自动获得固定的浅灰色:
这是因为,如果检测到缺失单元格,Sequenzo 的 SequenceData() 会附加一个缺失状态并添加灰色。例如,默认颜色或 custom_colors 对于非缺失状态的长度为 9,那么 SequenceData() 会自动为缺失状态附加灰色。
如果想自定义“丢失”状态的颜色,请参阅 本教程的这一部分.
具有自定义颜色的最小工作示例
我们使用内置的 pairfam-family 数据集 其色调柔和清新。
# 导入必要的库
# 您的调用代码(例如,在脚本或笔记本中)
from sequenzo import * # 导入包,并给它一个简短的别名
import pandas as pd # 数据操作
df = load_dataset("pairfam_family")
# 1)定义时间和状态(顺序很重要!)
time_list = [f"{i}" for i in range(1, 265)] # 264个月
states = list(range(1, 10)) # 1..9
# 2)人类可读的标签(字符串)
labels = [
"Single, no child",
"LAT, no child",
"Cohabiting, no child",
"Married, no child",
"Single, with child(ren)",
"LAT, with child(ren)",
"Cohabiting, with child(ren)",
"Married, 1 child",
"Married, 2+ children"
]
# 3) 全新调色板(9 种颜色,顺序与“州”相同)
colors_list = [
"#74C9B4", # 清新绿色
"#A6E3D0", # 水薄荷
"#F9E79F", # 淡杏色
"#F6CDA3", # 暖光橙色
"#F5B7B1", # 柔和玫瑰色
"#D7BDE2", # 淡薰衣草色
"#A3C4F3", # 瓷蓝色
"#7FB3D5", # 湖蓝色
"#EAECEE" # 云白色
]
sequence_data = SequenceData(
df,
time=time_list,
id_col="id",
states=states,
labels=labels,
# 如果你的数据不包含权重,则不需要包含以下参数
weights=df["weight40"].values,
custom_colors=colors_list
)
# 可选:预览使用这些颜色的图例
sequence_data.plot_legend()输出:
[>] SequenceData initialized successfully! Here's a summary:
[>] Number of sequences: 1866
[>] Number of time points: 264
[>] Min/Max sequence length: 264 / 264
[>] States: [1, 2, 3, 4, 5, 6, 7, 8, 9]
[>] Labels: ['Single, no child', 'Living apart together, no child', 'Cohabiting, no child', 'Married, no child', 'Single, with child(ren)', 'LAT, with child(ren)', 'Cohabiting, with child(ren)', 'Married, 1 child', 'Married, 2+ children']
[>] Weights: Provided (total weight=2346.268, mean=1.257, std=1.046)
使用SequenceData中定义的颜色,可以继续生成可视化效果,并且图表现在将使用选择的自定义调色板显示:
plot_sequence_index(sequence_data,
xlabel="Month (age 18-40)")
即用型调色板
以下可以直接复制到 custom_colors 中的精选调色板。小方块显示的是实际颜色。下面的自定义调色板设计得柔和,视觉上美观,适合一般用途。
在示例中,我们提供了九种颜色,因为我们的演示数据集有九种状态,这已经相当多了。自己的数据集的状态可能更多或更少,这完全没问题。如果状态较少,只需选择调色板的一个子集并测试其在可视化中的外观(例如,通过调用 plot_sequence_index(sequence_data))。
如果状态更多,您可以通过两种方式扩展调色板:
使用颜色选择器工具(e.g., htmlcolorcodes.com) 从喜欢的图像中选择其他色调。
让人工智能生成与你已选颜色相协调的互补色。
在实践中,定义你喜欢的调色板通常是一个反复的过程:尝试一组颜色,将你的序列可视化,并不断调整,直到结果既清晰又美观。
格式说明:所有颜色均以十六进制 (hex) 代码指定,例如 #74C9B4。十六进制代码是以 16 为基数的红、绿、蓝值 (RGB) 的六位数字表示。这是在 Web 和绘图库(例如 Matplotlib)中编写颜色的标准方式,便于在不同工具之间复制和重用。
清新春日(9色,温柔清新)
十六进制列表:
["#74C9B4","#A6E3D0","#F9E79F","#F6CDA3","#F5B7B1","#D7BDE2","#A3C4F3","#7FB3D5","#EAECEE"]水墨粉彩(9 种颜色,如中国传统绘画般轻盈的粉彩)
十六进制列表:
["#A3C9A8","#CFE8CF","#F2E6C2","#F6D5C3","#E8B4B8","#D8C7E8","#BBD3F2","#9EC5E6","#EDEDED"]薄荷薰衣草(9 种颜色,新鲜薄荷和柔和薰衣草色调)
十六进制列表:
["#A8E6CF","#B8F2E6","#C7F0DB","#D6F0E8","#E5F0F0","#F0E5F0","#E8D6F0","#D6C7F0","#C7B8F0"]顺序(序数)单色渐变(9 种颜色,用于有序状态)
选择一个渐变色,并在你的状态自然排序(例如,低→高)时使用它。这些渐变色颜色单调明亮,易于打印。如果您喜欢其他颜色,请尝试 这个网页.
蓝色渐变
十六进制列表:
["#EAF2FB","#D3E4F7","#BDD6F2","#A6C7EE","#90B9E9","#79AAE5","#639CE0","#4C8EDC","#3680D7"]青色渐变
十六进制列表:
["#EAF6F3","#D1EEE7","#B9E6DC","#A1DED0","#89D6C5","#71CEB9","#59C6AE","#41BEA2","#29B697"]想要更有创意吗?
如果你想超越内置调色板,你可以
- 参考颜色组合集合 colorhunt.co
- 或者直接从图像中选择自定义颜色。一个简单的工具,例如 imagecolorpicker.com 让您上传任何图片(比如一幅画、一张照片,甚至是您项目的标志)并提取您想要的精确十六进制代码。
如何包含自定义缺失颜色
如果你希望 Missing 状态使用其他颜色(例如,比默认颜色稍暗),则需要按以下方式将 Missing 明确添加到 states 和 labels 参数中:
# 下面这行代码供大家参考:
colors_no_missing = ["#74C9B4","#A6E3D0","#F9E79F","#F6CDA3","#F5B7B1",
"#D7BDE2","#A3C4F3","#7FB3D5","#EAECEE"]
# 如果你想明确包含自定义缺失颜色
colors_with_missing = colors_no_missing + ["#C4C4C4"] # 自定义缺失
sequence_data = SequenceData(
df, time=time_list, id_col="id",
states=states + ["Missing"],
labels=labels + ["Missing"],
custom_colors=colors_with_missing
)故障排除问答
您可能会遇到以下错误消息:
“以下提供的‘状态’在数据中未找到……”
仔细检查每个状态值是否确实出现在 df[time] 中(完全相等)。如果使用字符串,请检查空格和大小写。
“custom_colors 的长度必须与状态数匹配。”
在处理缺失值后统计状态数。如果自动添加缺失值,请传递一个 len = 非缺失状态的调色板(Sequenzo 会添加灰色),或者传递包含缺失值颜色的完整长度。
“我的标签是数字,可以吗?”
请将标签作为字符串传递(例如,“低”、“高”)。否则,验证器会发出警告。
作者:梁彧祺
翻译:曲思竹