Python ete3 - 有没有办法拉伸系统发育树的分支?
Python ete3 - Is there a way to stretch branches of phylogenetic trees?
我正在尝试阅读系统发育树并将其分支拉伸到比原来的更大或更小,但我没有找到如何。
拉伸需要在树本身上 - 而不是在它的可视化上。
例如下面的代码读取一棵树并呈现它:
from ete3 import Tree
t = Tree("(2azaa:0.1871453443,1dz0a:0.1944528747, (((1joi:0.1917345578,1nwpa:0.206793251):0.2050584423,"
"(1jzga:0.3027313573,1rkra:0.2710518895):0.08148637118):0.06756061176,(1cuoa:0.2959705289,"
"((1qhqa:0.585997308,1gy1a:2.509606787):0.1590837051,(1kdj:0.9427371887,"
"((1iuz:0.1918780006,7pcy:0.2035503755):0.1750205426,((2plt:0.2727097306,(2b3ia:0.6259053315,"
"(((1bawa:0.3036227494,1nin:0.5134587308):0.1375675558,((2raca:0.4617882857,1id2a:0.3274320042):0.7764884063,"
"(1pmy:0.7017063073,(1bqk:0.2214168026,(1adwa:0.4171298259,1paz:0.4214910379):0.08599165577):0.2074622534):0.9354371144):0.4486761297)"
":0.1105387947,(1m9wa:0.4551681561,1bxva:0.3931722476):0.06879588421):0.1131812572):0.4242876607):0.1447393581,"
"(1plb:0.2176281022,(1byoa:0.2314554253,(9pcy:0.2456728049,(1ag6:0.1776514893,1plc:0.318467746):0.02728470893)"
":0.07383541027):0.1260361833):0.2659408726):0.05013755844):0.2637791318):1.001560925):1.018869112):0.4609302267):0.1807238866);")
t.show()
下面link讨论如何使用这个库,但是我没有找到我要找的东西:
http://etetoolkit.org/docs/latest/tutorial/tutorial_trees.html
有人可以帮忙吗?
编辑:如果有其他 Python 库可以做到这一点,我很想知道是哪个库以及如何完成的。
Edit2:我知道在 R 中有一个名为 "ape" 的库,然后可以非常简单地完成它......也许使用它的人知道某些 python 库中的并行操作?
到目前为止我还没有找到做这个拉伸的方法...
我编写了一个简单的代码,遍历代表树的字符串,找到数字(即早午餐的长度)然后乘以 2。
这是一个补丁而不是一个真正的解决方案......仍然希望有人能有想法。
for c in original_tree:
if is_number(c) or c=='.':
number+=c
else:
if len(number)<5:
stretched_tree+=number
number=""
elif number!="":
stretched_tree+=str(float(number)*2)
number = ""
stretched_tree+=c
找了半天找到解决方法:
据我所知,系统发育 python 库中没有内置函数来拉伸树。这很奇怪,我希望我是错的。
然而,一旦您了解了它们的数据结构,就有一种简单的方法可以做到:您需要做的只是 运行 遍历树中的所有边,然后将它们乘以所需的因子。这样做的方式不同,具体取决于您使用的库。
下面是两个如何使用 dendropy 和 ete3 将树拉伸两倍大小的示例:
from ete3 import Tree
import dendropy as dp
original_tree = "(2azaa:0.1871453443,1dz0a:0.1944528747,(((1joi:0.1917345578,1nwpa:0.206793251):0.2050584423,"\
"(1jzga:0.3027313573,1rkra:0.2710518895):0.08148637118):0.06756061176,(1cuoa:0.2959705289,"\
"((1qhqa:0.585997308,1gy1a:2.509606787):0.1590837051,(1kdj:0.9427371887,"\
"((1iuz:0.1918780006,7pcy:0.2035503755):0.1750205426,((2plt:0.2727097306,(2b3ia:0.6259053315,"\
"(((1bawa:0.3036227494,1nin:0.5134587308):0.1375675558,((2raca:0.4617882857,1id2a:0.3274320042):0.7764884063,"\
"(1pmy:0.7017063073,(1bqk:0.2214168026,(1adwa:0.4171298259,1paz:0.4214910379):0.08599165577):0.2074622534):0.9354371144):0.4486761297)"\
":0.1105387947,(1m9wa:0.4551681561,1bxva:0.3931722476):0.06879588421):0.1131812572):0.4242876607):0.1447393581,"\
"(1plb:0.2176281022,(1byoa:0.2314554253,(9pcy:0.2456728049,(1ag6:0.1776514893,1plc:0.318467746):0.02728470893)"\
":0.07383541027):0.1260361833):0.2659408726):0.05013755844):0.2637791318):1.001560925):1.018869112):0.4609302267):0.1807238866);"
#dendropy test
print("These are the dendropy results:")
t1 = dp.Tree.get_from_string(original_tree,"newick")
t2 = dp.Tree.get_from_string(original_tree,"newick")
for edge in t2.levelorder_edge_iter():
if(edge.length == None):
continue
edge.length *=2
print(t1)
print(t2)
#ete3 test
print("These are the ete3 results:")
t3 = Tree(original_tree)
t4 = Tree(original_tree)
for node in t4.iter_descendants():
node.dist*=2
print(t3.write())
print(t4.write())
我们可以从这个案例中学到的另一个教训 - 在搜索内置函数之前,请务必对您使用的数据结构做功课...
我正在尝试阅读系统发育树并将其分支拉伸到比原来的更大或更小,但我没有找到如何。 拉伸需要在树本身上 - 而不是在它的可视化上。
例如下面的代码读取一棵树并呈现它:
from ete3 import Tree
t = Tree("(2azaa:0.1871453443,1dz0a:0.1944528747, (((1joi:0.1917345578,1nwpa:0.206793251):0.2050584423,"
"(1jzga:0.3027313573,1rkra:0.2710518895):0.08148637118):0.06756061176,(1cuoa:0.2959705289,"
"((1qhqa:0.585997308,1gy1a:2.509606787):0.1590837051,(1kdj:0.9427371887,"
"((1iuz:0.1918780006,7pcy:0.2035503755):0.1750205426,((2plt:0.2727097306,(2b3ia:0.6259053315,"
"(((1bawa:0.3036227494,1nin:0.5134587308):0.1375675558,((2raca:0.4617882857,1id2a:0.3274320042):0.7764884063,"
"(1pmy:0.7017063073,(1bqk:0.2214168026,(1adwa:0.4171298259,1paz:0.4214910379):0.08599165577):0.2074622534):0.9354371144):0.4486761297)"
":0.1105387947,(1m9wa:0.4551681561,1bxva:0.3931722476):0.06879588421):0.1131812572):0.4242876607):0.1447393581,"
"(1plb:0.2176281022,(1byoa:0.2314554253,(9pcy:0.2456728049,(1ag6:0.1776514893,1plc:0.318467746):0.02728470893)"
":0.07383541027):0.1260361833):0.2659408726):0.05013755844):0.2637791318):1.001560925):1.018869112):0.4609302267):0.1807238866);")
t.show()
下面link讨论如何使用这个库,但是我没有找到我要找的东西:
http://etetoolkit.org/docs/latest/tutorial/tutorial_trees.html
有人可以帮忙吗?
编辑:如果有其他 Python 库可以做到这一点,我很想知道是哪个库以及如何完成的。
Edit2:我知道在 R 中有一个名为 "ape" 的库,然后可以非常简单地完成它......也许使用它的人知道某些 python 库中的并行操作?
到目前为止我还没有找到做这个拉伸的方法...
我编写了一个简单的代码,遍历代表树的字符串,找到数字(即早午餐的长度)然后乘以 2。 这是一个补丁而不是一个真正的解决方案......仍然希望有人能有想法。
for c in original_tree:
if is_number(c) or c=='.':
number+=c
else:
if len(number)<5:
stretched_tree+=number
number=""
elif number!="":
stretched_tree+=str(float(number)*2)
number = ""
stretched_tree+=c
找了半天找到解决方法: 据我所知,系统发育 python 库中没有内置函数来拉伸树。这很奇怪,我希望我是错的。
然而,一旦您了解了它们的数据结构,就有一种简单的方法可以做到:您需要做的只是 运行 遍历树中的所有边,然后将它们乘以所需的因子。这样做的方式不同,具体取决于您使用的库。 下面是两个如何使用 dendropy 和 ete3 将树拉伸两倍大小的示例:
from ete3 import Tree
import dendropy as dp
original_tree = "(2azaa:0.1871453443,1dz0a:0.1944528747,(((1joi:0.1917345578,1nwpa:0.206793251):0.2050584423,"\
"(1jzga:0.3027313573,1rkra:0.2710518895):0.08148637118):0.06756061176,(1cuoa:0.2959705289,"\
"((1qhqa:0.585997308,1gy1a:2.509606787):0.1590837051,(1kdj:0.9427371887,"\
"((1iuz:0.1918780006,7pcy:0.2035503755):0.1750205426,((2plt:0.2727097306,(2b3ia:0.6259053315,"\
"(((1bawa:0.3036227494,1nin:0.5134587308):0.1375675558,((2raca:0.4617882857,1id2a:0.3274320042):0.7764884063,"\
"(1pmy:0.7017063073,(1bqk:0.2214168026,(1adwa:0.4171298259,1paz:0.4214910379):0.08599165577):0.2074622534):0.9354371144):0.4486761297)"\
":0.1105387947,(1m9wa:0.4551681561,1bxva:0.3931722476):0.06879588421):0.1131812572):0.4242876607):0.1447393581,"\
"(1plb:0.2176281022,(1byoa:0.2314554253,(9pcy:0.2456728049,(1ag6:0.1776514893,1plc:0.318467746):0.02728470893)"\
":0.07383541027):0.1260361833):0.2659408726):0.05013755844):0.2637791318):1.001560925):1.018869112):0.4609302267):0.1807238866);"
#dendropy test
print("These are the dendropy results:")
t1 = dp.Tree.get_from_string(original_tree,"newick")
t2 = dp.Tree.get_from_string(original_tree,"newick")
for edge in t2.levelorder_edge_iter():
if(edge.length == None):
continue
edge.length *=2
print(t1)
print(t2)
#ete3 test
print("These are the ete3 results:")
t3 = Tree(original_tree)
t4 = Tree(original_tree)
for node in t4.iter_descendants():
node.dist*=2
print(t3.write())
print(t4.write())
我们可以从这个案例中学到的另一个教训 - 在搜索内置函数之前,请务必对您使用的数据结构做功课...