Python使用Toytree基于Dataframe聚类值为系统发育树标签着色
基于Toytree匹配聚类值自定义系统发育树标签颜色
核心逻辑是通过两层映射完成ID到聚类值、聚类值到颜色的匹配,核心要求是传给tip_labels_colors的颜色列表顺序,必须和rtre.get_tip_labels()返回的末端标签顺序完全一致,否则会出现颜色错配。
具体步骤
- 把两列的聚类数据整理为「末端ID-聚类值」的查询字典,避免逐行遍历Dataframe匹配的低效率问题。
- 建立「聚类值-颜色」的映射表,可手动指定固定配色,也可通过调色板自动生成离散配色。
- 严格按照树对象返回的末端标签顺序,逐个查询对应颜色,生成顺序完全对齐的颜色列表。
- 将颜色列表传入绘图参数即可。
完整实现代码
适配自有数据的代码
import toytree import pandas as pd import numpy as np # 1. 加载聚类数据,替换为你的文件路径,分隔符按实际文件调整(空格分隔用sep="\s+",制表符用sep="\t") df = pd.read_csv( "你的聚类文件路径", sep="\s+", header=None, names=["tip_id", "cluster"] ) tip_cluster_map = dict(zip(df["tip_id"], df["cluster"])) # 2. 配置聚类对应颜色 # 方式一:手动指定,适合聚类数量少的场景 cluster_color_map = { 1: "#ff0000", # 聚类1对应红色 2: "#00ff00", # 聚类2对应绿色 7: "#5384a3", 20: "#d6557c" # 补全你所有聚类值对应的颜色即可 } # 方式二:聚类数量多时自动生成配色,无需手动枚举 # unique_clusters = df["cluster"].unique() # palette = toyplot.color.brewer.palette("Set2", count=len(unique_clusters)) # cluster_color_map = dict(zip(unique_clusters, palette)) # 3. 加载树文件,按你的需求设置外类群/根节点 rtre = toytree.tree("你的树文件路径").root(wildcard="你的根节点匹配关键词") # 4. 按树的末端标签顺序生成颜色列表(核心,顺序不能乱) colorlist = [cluster_color_map[tip_cluster_map[tip]] for tip in rtre.get_tip_labels()] # 5. 绘图 rtre.draw( tip_labels_align=True, tip_labels_colors=colorlist )
可直接运行的验证示例(基于公开测试树)
如果要先验证逻辑,可以运行以下测试代码,模拟聚类数据完成配色:
import toytree import toyplot import pandas as pd import numpy as np # 加载测试树 url = "https://eaton-lab.org/data/Cyathophora.tre" rtre = toytree.tree(url).root(wildcard='prz') # 模拟和你格式一致的聚类Dataframe,给每个末端随机分配3个聚类值 df = pd.DataFrame({ "tip_id": rtre.get_tip_labels(), "cluster": np.random.choice([1,2,3], size=len(rtre.get_tip_labels())) }) tip_cluster_map = dict(zip(df["tip_id"], df["cluster"])) # 配置聚类颜色 cluster_color_map = {1: "#ff0000", 2: "#00ff00", 3: "#0000ff"} # 生成顺序对齐的颜色列表 colorlist = [cluster_color_map[tip_cluster_map[tip]] for tip in rtre.get_tip_labels()] # 出图 rtre.draw( tip_labels_align=True, tip_labels_colors=colorlist )
常见报错排查
- 出现
KeyError:先检查树文件的末端ID和Dataframe里的ID是否完全一致,有没有多余空格、后缀缺失、大小写不匹配的问题。 - 颜色和聚类对应错位:确认生成
colorlist时是直接遍历rtre.get_tip_labels()的返回值,没有单独对ID列表做排序、去重等打乱顺序的操作。 - 颜色显示异常:检查传入的颜色值是否为合法的十六进制色值,或toyplot支持的颜色对象。
内容的提问来源于stack exchange,提问作者Someone_1313
相关产品推荐
相关产品推荐

