2010-10-29 11 views
6

Ich versuche, einen Baum mit BioPython, Phylo-Modul zu bauen.
Was ich bisher getan habe, ist dieses Bild: alt textPhylo BioPython Gebäude Bäume

jeder Name hat eine vierstellige Zahl, gefolgt von - und eine Zahl: diese Nummer bezieht sich auf die Anzahl der Male, die Sequenz dargestellt wird. Das bedeutet 1578 - 22, dieser Knoten sollte 22 Folgen darstellen.

die Datei mit den ausgerichteten Sequenzen: file
die Datei mit dem Abstand, einen Baum zu erstellen: file

I So jetzt bekannt, wie jede Größe des Knotens zu ändern. Jeder Knoten eine andere Größe hat, das einfach ein Array von den verschiedenen Werten tut:

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()) 

Aber das Array ist willkürlich, ich möchte den richtigen Knotengröße in den rechten Knoten setzen, habe ich versucht, dies:

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

aber nichts erscheint, wenn ich die if-Anweisung verwende.

Wie auch immer dabei?

würde ich wirklich schätzen!

Danke allen

+0

Können Sie die Testdateien zur Verfügung stellen Sie für diesen Baum mit? – rwilliams

Antwort

8

Ich habe endlich funktioniert. Die Grundvoraussetzung ist, dass Sie die labels/nodelist verwenden, um Ihre node_sizes zu bauen. Auf diese Weise korrelieren sie richtig. Ich bin sicher, dass ich einige wichtige Optionen vermisse, um den Baum 100% aussehen zu lassen, aber es scheint, dass die Knotengrößen richtig angezeigt werden.

#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() 

Baum Resultierende alt text

+0

Eigentlich hatte ich das auch versucht und es macht das Gleiche. Ich kann die Testdatei zur Verfügung stellen, aber vielleicht ist es zu groß, um es hier zu zeigen – pavid

+0

Versuchen Sie Pastie.org und wählen Sie html/xml als den Typ – rwilliams

+0

es ist in der Frage. Danke :) – pavid