You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Ete3绘制节点按降序排列的Newick树?

用Ete3实现自定义排序的树图绘制

可以通过Ete3的自定义节点排序功能实现你的需求:让值最大的节点处于分支底部,且同一父节点的多分支子节点按降序排列(可根据需求调整排序方向)。

实现步骤

  • 构建带值的树结构:给每个节点添加用于排序的数值属性,再搭建匹配示例的树关系。
  • 自定义排序函数:编写排序逻辑,控制子节点的排列顺序,满足“最大值在底部”和“多分支降序”的要求。
  • 应用排序并绘制树:用sort_descendants()方法应用排序规则,再配置绘制样式生成树图。

代码示例

from ete3 import Tree, NodeStyle, TreeStyle

# 1. 用Newick格式构建树结构,对应示例中的节点层级
tree = Tree("((((((1:0,1:0)2:0,1:0)3:0,1:0)6:0,1:0)7:0,1:0)11:0,((((1:0,1:0)2:0,1:0)3:0,1:0)4:0,1:0)12:0);")

# 给每个节点设置用于排序的value值
for node in tree.traverse():
    if node.name in ["12", "11", "7", "6", "4", "3", "2"]:
        node.add_feature("value", int(node.name))
    else:
        node.add_feature("value", 1)

# 2. 自定义排序函数:按value降序排列子节点,若要最大值在底部,改为return a.value - b.value(升序)
def sort_nodes(a, b):
    return b.value - a.value

# 对所有节点的子节点应用排序规则
tree.sort_descendants(sort_func=sort_nodes)

# 3. 配置树的绘制样式,贴近示例的ASCII结构
ts = TreeStyle()
ts.show_leaf_name = True
# 隐藏节点圆点,让结构更简洁
for node in tree.traverse():
    ns = NodeStyle()
    ns["size"] = 0
    node.set_style(ns)
    node.name = str(node.value)

# 生成图片或直接显示树
tree.render("custom_tree.png", tree_style=ts)
# tree.show(tree_style=ts)

关键说明

  • 排序方向调整:如果要让最大值节点处于分支底部,只需将排序函数改为return a.value - b.value,子节点会按升序排列,小值在上、大值在下。
  • 多分支适配:当父节点有2个以上子节点时,排序函数会自动按设定规则排列所有子节点,满足降序要求。
  • 样式自定义:示例中隐藏了节点圆点,你可以根据需求调整节点大小、颜色等样式,让树图更贴合预期。

内容的提问来源于stack exchange,提问作者xosxos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:03:13