跳转到内容

推荐的配色方案以及如何自定义它们

处理序列数据时,清晰一致的颜色非常重要:它们可以帮助读者快速区分状态,并在不同图表之间进行比较。在 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 状态)

缺失值

缺失值总是自动获得固定的浅灰色:

一般来说,在创建 `SequenceData()` 对象时,可以定义状态,而无需明确考虑“缺失”。

这是因为,如果检测到缺失单元格,Sequenzo 的 SequenceData() 会附加一个缺失状态并添加灰色。例如,默认颜色或 custom_colors 对于非缺失状态的长度为 9,那么 SequenceData() 会自动为缺失状态附加灰色。

如果想自定义“丢失”状态的颜色,请参阅 本教程的这一部分.

具有自定义颜色的最小工作示例

我们使用内置的 pairfam-family 数据集 其色调柔和清新。

python

# 导入必要的库
# 您的调用代码(例如,在脚本或笔记本中)

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()

输出:

python
[>] 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中定义的颜色,可以继续生成可视化效果,并且图表现在将使用选择的自定义调色板显示:

python
plot_sequence_index(sequence_data, 
                    xlabel="Month (age 18-40)")

显示示例可视化

即用型调色板

以下可以直接复制到 custom_colors 中的精选调色板。小方块显示的是实际颜色。下面的自定义调色板设计得柔和,视觉上美观,适合一般用途。

在示例中,我们提供了九种颜色,因为我们的演示数据集有九种状态,这已经相当多了。自己的数据集的状态可能更多或更少,这完全没问题。如果状态较少,只需选择调色板的一个子集并测试其在可视化中的外观(例如,通过调用 plot_sequence_index(sequence_data))。

如果状态更多,您可以通过两种方式扩展调色板:

  1. 使用颜色选择器工具(e.g., htmlcolorcodes.com) 从喜欢的图像中选择其他色调。

  2. 让人工智能生成与你已选颜色相协调的互补色。

在实践中,定义你喜欢的调色板通常是一个反复的过程:尝试一组颜色,将你的序列可视化,并不断调整,直到结果既清晰又美观。

格式说明:所有颜色均以十六进制 (hex) 代码指定,例如 #74C9B4。十六进制代码是以 16 为基数的红、绿、蓝值 (RGB) 的六位数字表示。这是在 Web 和绘图库(例如 Matplotlib)中编写颜色的标准方式,便于在不同工具之间复制和重用。

清新春日(9色,温柔清新)

十六进制列表:

python
["#74C9B4","#A6E3D0","#F9E79F","#F6CDA3","#F5B7B1","#D7BDE2","#A3C4F3","#7FB3D5","#EAECEE"]

水墨粉彩(9 种颜色,如中国传统绘画般轻盈的粉彩)

十六进制列表:

python
["#A3C9A8","#CFE8CF","#F2E6C2","#F6D5C3","#E8B4B8","#D8C7E8","#BBD3F2","#9EC5E6","#EDEDED"]

薄荷薰衣草(9 种颜色,新鲜薄荷和柔和薰衣草色调)

十六进制列表:

python
["#A8E6CF","#B8F2E6","#C7F0DB","#D6F0E8","#E5F0F0","#F0E5F0","#E8D6F0","#D6C7F0","#C7B8F0"]

顺序(序数)单色渐变(9 种颜色,用于有序状态)

选择一个渐变色,并在你的状态自然排序(例如,低→高)时使用它。这些渐变色颜色单调明亮,易于打印。如果您喜欢其他颜色,请尝试 这个网页.

蓝色渐变

十六进制列表:

python
["#EAF2FB","#D3E4F7","#BDD6F2","#A6C7EE","#90B9E9","#79AAE5","#639CE0","#4C8EDC","#3680D7"]

青色渐变

十六进制列表:

python
["#EAF6F3","#D1EEE7","#B9E6DC","#A1DED0","#89D6C5","#71CEB9","#59C6AE","#41BEA2","#29B697"]

想要更有创意吗?

如果你想超越内置调色板,你可以

  • 参考颜色组合集合 colorhunt.co
  • 或者直接从图像中选择自定义颜色。一个简单的工具,例如 imagecolorpicker.com 让您上传任何图片(比如一幅画、一张照片,甚至是您项目的标志)并提取您想要的精确十六进制代码。

如何包含自定义缺失颜色

如果你希望 Missing 状态使用其他颜色(例如,比默认颜色稍暗),则需要按以下方式将 Missing 明确添加到 stateslabels 参数中:

python
# 下面这行代码供大家参考:
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 会添加灰色),或者传递包含缺失值颜色的完整长度。

“我的标签是数字,可以吗?”

请将标签作为字符串传递(例如,“低”、“高”)。否则,验证器会发出警告。


作者:梁彧祺

翻译:曲思竹

Released under the BSD-3-Clause License.