toytree结合了一种流行的基于ete3库的树数据结构和基于toyplot库的现代绘图工具。toytree的目标是提供一个轻量级的python,相当于r中常用的树操作和绘图库,并以此促进python中系统发生方法的进一步发展。toytree生成丰富的交互式图形(svg+html+js),可以嵌入到jupyter笔记本或网页中,也可以用svg、pdf或png呈现出版物。
官方参考网站:https://toytree.readthedocs.io/en/latest/Cookbook.html
参考网站提供了一整套的样本和详细的操作流程,基本上跟着他的流程走一遍应该就会用这个软件了,对类似我这样的小白非常友好。
安装
可以使用conda(首选)或从pip使用单个命令安装toytree及其依赖项(toyplot和numpy)。
conda install toytree -c eaton-lab
使用
#载入相关包
import toytree # a tree plotting library
import toyplot # a general plotting library
import numpy as np # numerical library
#查看相关包的版本
print(toytree.__version__)
print(toyplot.__version__)
print(np.__version__)
2.0.0
0.20.0-dev
1.17.3
除了提供绘图功能外,还提供了一些用于返回树的值和统计信息的有用函数和属性。正如我们将在下面看到的,您可以以许多方式生成ToyTree对象,但通常是通过读取newick格式的文本字符串来完成的。下面的例子展示了加载ToyTree的最简单方法,即使用ToyTree .tree()方便函数来解析文件、URL或字符串。
#toytree 可以使用网上的树文件或本地的树文件,使用本地树文件的时候将连接换成本地树文件的绝对路径就行,注意window系统下路径中的 \ 需要换成 /
#toytree的操作命令是赋值变量后接命令。如下面的例子中将树文件赋值到变量tre,置根的命令就是tre.root(),将置根后的树赋值给rtre之后,绘图的命令就是rtre.draw()
# load a toytree from a newick string at a URL 这样就读入了一个树文件
tre = toytree.tree("https://eaton-lab.org/data/Cyathophora.tre")
# root and draw the tree (more details on this coming up...)
rtre = tre.root(wildcard="prz")
rtre.draw(tip_labels_align=True);
image.png
基础绘图
置根,使用.root()命令来对树进行置根,置根有三种方法,可以对单个样品或多个样品进行置根。也可以使用模糊名称匹配选项来匹配多个名称,如下所示
# three ways to do the same re-rooting
rtre = tre.root(names=["32082_przewalskii", "33588_przewalskii"]) # 直接指定作为根部的名单
rtre = tre.root(wildcard="prz")#指定包含prz字符的样品作为根部
rtre = tre.root(regex="[0-9]*_przewalskii")#指定任意数字与 _przewalskii组合的样品作为根部
# draw the rooted tree 置根
rtre.draw(node_labels='idx', node_sizes=15);#编辑节点显示的内容和节点大小
还有一个函数.unroot()用于从树中删除根节点。这在根处创建了一个多分支。从技术上讲,树节点结构上仍然存在一个点,我们称之为根,但它不会出现在绘图中。
# an unrooted tree
rtre.unroot().draw();
image.png
Drop tips 删除类群
可以删除掉树中的类群,同样也可以使用模糊匹配的方法进行匹配。
rtre.drop_tips(wildcard="cyatho").draw(); #删除名字中包含 cyatho 的样品
image.png
Ladderize 阶梯状排列
一般情况的树形默认是阶梯状的,如果树形改变了,可以使用.ladderize()命令将树形按阶梯状顺序排列
# dropping tips unladderized the tree, so we re-ladderized it before plotting
rtre.drop_tips(wildcard="cyatho").ladderize().draw();
image.png
Rotate nodes 旋转节点
旋转树的节点不会影响实际的树结构(例如,newick结构不会改变),它只会影响绘制树时显示的顺序。您可以像前面示例中那样,使用 names, wildcard, or regex来旋转节点。这些名称必须来自一个单系分支。旋转节点用于绘图通常是出于一些审美原因,例如将提示与绘制在树的提示上的地理位置或特征值进行更好的对齐。
rtre.rotate_node(wildcard="prz").draw();
image.png
Resolve polytomy 解决多分枝的问题
有时候会有那种多分枝的情况,可以使用resolve_polytomy()进行调整
toytree.tree("((a,b,c),d);").resolve_polytomy(dist=1.).draw();
image.png
Chaining functions and arguments
因为toytree中的树修改调用总是返回对象的副本,所以在构建绘图时可以将许多这些函数链接在一起。如果您只是为了绘制(例如,旋转节点)而临时修改树,不需要存储中间树。这有点类似于bash编程中使用管道。当在toytree代码中链接许多函数调用和绘制样式时,最好使用良好的编码习惯。在下面的例子中,我将每个函数调用和样式选项分隔在单独的一行上。这使得代码更具可读性,也更容易调试,因为您可以一次注释掉一行来检查其效果,而不会破坏命令的其余部分。主函数调用周围的括号使这成为可能。
# readable style for writing long draw functions
canvas, axes, mark = (
tre
.root(wildcard="prz")
.drop_tips(wildcard="superba")
.rotate_node(wildcard="30686")
.draw(
tip_labels_align=True,
edge_style={
"stroke": toytree.colors[3],
}
)
)
image.png
rtre.get_tip_labels() # list of labels in node-plot order
rtre.get_tip_coordinates() # array of tip plot coordinates in idx order
rtre.get_node_values() # list in node-plot order
rtre.get_node_dict() # dict mapping idx:name for each tip
rtre.get_node_coordinates() # array of node plot coordinates in idx order
rtre.get_edge_values() # list of edge values in edge plot order
rtre.get_edge_values_mapped(); # list of edge values with mapped dict in edge plot order
rtre.is_bifurcating() # boolean
rtre.is_rooted(); # boolean
rtre.nnodes # number of nodes in the tree
rtre.ntips # number of tips in the tree
rtre.newick # the newick representation of the tree
rtre.features # list of node features that can be accessed
rtre.style; # dict of plotting style of tree
Saving/writing ToyTrees
# if no file handle is entered then the newick string is returned
rtre.write()
'((32082_przewalskii:0.00259326,33588_przewalskii:0.00247134)100:0.0179371,(((29154_superba:0.00634237,30686_cyathophylla:0.00669945)100:0.00237995,(41954_cyathophylloides:8.88803e-05,41478_cyathophylloides:5.28218e-05)100:0.00941021)100:0.00297626,(33413_thamno:0.00565358,(30556_thamno:0.00653218,((40578_rex:0.00335406,35855_rex:0.00339963)100:0.00223,(35236_rex:0.00580525,(39618_rex:0.000962081,38362_rex:0.00109218)100:0.00617527)96:0.0007389)99:0.000783365)100:0.0010338)100:0.00538723)100:0.0179371);'
# the fmt (format) options write different newick formats.
rtre.write(tree_format=9)
'((32082_przewalskii,33588_przewalskii),(((29154_superba,30686_cyathophylla),(41954_cyathophylloides,41478_cyathophylloides)),(33413_thamno,(30556_thamno,((40578_rex,35855_rex),(35236_rex,(39618_rex,38362_rex)))))));'
# write to file
rtre.write("/tmp/mytree.tre", tree_format=0)
网友评论