2010-10-29 74 views
6

我试图用BioPython,Phylo模块构建树。
什么我目前所做的就是这种形象:alt textPhylo BioPython构建树

每个名字都有一个四位数字,其次是 - 和一些:这个数字指的倍序列代表的数字。这意味着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语句时什么也没有出现。

反正这么做?

我真的很感激!

谢谢大家

+0

你能否提供你正在使用那棵树的测试文件? – rwilliams 2010-11-02 08:50:07

回答

8

我终于得到了这个工作。基本前提是您要使用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() 

结果树 alt text

+0

其实我也尝试过,它也做同样的事情。我可以提供测试文件,但可能它太大而无法在此处显示 – pavid 2010-11-02 10:33:02

+0

尝试Pastie.org并选择html/xml作为 – rwilliams 2010-11-02 10:41:14

+0

这个问题的类型。谢谢:) – pavid 2010-11-02 11:23:23