【问题标题】:Phylo BioPython building treesPhylo BioPython 构建树
【发布时间】:2010-10-29 11:36:36
【问题描述】:

我尝试使用 BioPython、Phylo 模块构建一棵树。
到目前为止我所做的是这张图片:

每个名称都有一个四位数字,后跟一个 - 和一个数字:这个数字是指该序列被表示的次数。这意味着 1578 - 22,该节点应该代表 22 个序列。

序列对齐的文件:file
建树距离文件:file

所以现在我知道如何更改节点的每个大小。每个节点都有不同的大小,这很容易做一个不同值的数组:

    fh = open(MEDIA_ROOT + "groupsnp.txt")    
    list_size = {}
    for line in fh:
        if '>' in line:
            labels = line.split('>')
            label = labels[-1]
            label = label.split()
            num = line.split('-')
            size = num[-1]
            size = size.split()
            for lab in label:
                for number in size:
                    list_size[lab] = int(number)

    a = array(list_size.values())

但是数组是任意的,我想把正确的节点大小放入正确的节点,我试过这个:

         for elem in list_size.keys():
             if labels == elem:
                 Phylo.draw_graphviz(tree_xml, prog="neato", node_size=a)

但是当我使用 if 语句时什么都没有出现。

要这样做吗?

非常感谢!

谢谢大家

【问题讨论】:

  • 你能提供你用于那棵树的测试文件吗?

标签: python numpy graphviz biopython


【解决方案1】:

我终于得到了这个工作。基本前提是您将使用labels/nodelist 来构建您的node_sizes。这样它们就可以正确关联。我确定我错过了一些使树看起来 100% 的重要选项,但似乎节点大小正确显示。

#basically a stripped down rewrite of Phylo.draw_graphviz
import networkx, pylab
from Bio import Phylo


#taken from draw_graphviz
def get_label_mapping(G, selection): 
    for node in G.nodes(): 
        if (selection is None) or (node in selection): 
            try: 
                label = str(node) 
                if label not in (None, node.__class__.__name__): 
                    yield (node, label) 
            except (LookupError, AttributeError, ValueError): 
                pass


kwargs={}
tree = Phylo.read('tree.dnd', 'newick')
G = Phylo.to_networkx(tree)
Gi = networkx.convert_node_labels_to_integers(G, discard_old_labels=False)

node_sizes = []
labels = dict(get_label_mapping(G, None))
kwargs['nodelist'] = labels.keys()

#create our node sizes based on our labels because the labels are used for the node_list
#this way they should be correct
for label in labels.keys():
    if str(label) != "Clade":
        num = label.name.split('-')
        #the times 50 is just a guess on what would look best
        size = int(num[-1]) * 50
        node_sizes.append(size)

kwargs['node_size'] = node_sizes
posi = networkx.pygraphviz_layout(Gi, 'neato', args='') 
posn = dict((n, posi[Gi.node_labels[n]]) for n in G) 

networkx.draw(G, posn, labels=labels, node_color='#c0deff', **kwargs)

pylab.show()

结果树

【讨论】:

  • 实际上我也尝试过,它做同样的事情。我可以提供测试文件,但可能太大,无法在此处显示
  • 试试 Pastie.org 并选择 html/xml 作为类型
  • 非常感谢!它工作得很好,实际上我昨天看了这个例子,但并没有真正能够实现。谢谢:)
  • 抱歉 r-dud,我忘了给你赏金 :) 谢谢你的帮助
  • 很抱歉打扰您,但是如果我想更改一个节点的颜色怎么办?我尝试了类似的东西,但给了我一个错误
猜你喜欢
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 2013-03-25
  • 2016-09-22
相关资源
最近更新 更多