首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python ete3 --有办法伸展系统发育树的分支吗?

Python ete3 --有办法伸展系统发育树的分支吗?
EN

Stack Overflow用户
提问于 2017-04-15 17:23:18
回答 2查看 458关注 0票数 1

我试着读一棵系统发育树,把它的枝条伸展得比原来的更大或更小,但我没有找到。伸展需要在树本身,而不是它的可视化。

例如,下面的代码读取一棵树并显示它:

代码语言:javascript
复制
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()

下面的链接讨论了如何使用库,但没有找到我要查找的内容:

trees.html

有人能帮忙吗?

编辑:如果还有其他Python库可以做到这一点,我很想知道它是如何完成的。

Edit2:我知道在R中有一个名为"ape“的库,它可以很简单地完成.也许有人知道在某个python库中的并行操作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-16 19:42:08

过了很长一段时间,我找到了一个解决方案:据我所知,没有内置函数来扩展系统内的python库中的树。这很奇怪,我希望我错了。

然而,一旦您了解了它们的数据结构,就可以很容易地做到这一点:您所需要做的就是遍历树中的所有边缘,并将它们乘以所需的因子。这是不同的操作,取决于您使用的库。下面是两个示例,说明如何使用树状体和ete3将树的大小扩展两倍:

代码语言:javascript
复制
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())

我们可以从这个案例中学到的另一个教训--在搜索内置函数之前,一定要做好数据结构方面的准备工作。

票数 2
EN

Stack Overflow用户

发布于 2017-04-15 18:29:57

到目前为止我还没有找到办法来做这一段..。

我做了一个简单的代码,运行在代表树的字符串上,找到数字(它们是短消息长度),然后乘以2。这是一个补丁,而不是一个真正的解决方案。还是希望有人能有个主意。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43429038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档