2010-10-29 4 views
6

Je tente de construire un arbre avec BioPython, module Phylo.
Ce que je l'ai fait jusqu'à présent est cette image: alt textPhylo BioPython arbres de construction

chaque nom a un numéro à quatre chiffres suivi - et un numéro: ce numéro se réfèrent au nombre de fois que la séquence est représentée. Cela signifie 1578 - 22, ce noeud devrait représenter 22 séquences.

le fichier avec les séquences alignées: file
le fichier avec la distance pour construire un arbre: file

Alors maintenant, je connais comment changer chaque taille du noeud. Chaque noeud a une taille différente, ce fait facile un tableau des différentes valeurs:

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

Mais le tableau est arbitraire, je voudrais mettre la taille du noeud correct dans le nœud droit, j'ai essayé ceci:

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

mais rien n'apparaît lorsque j'utilise l'instruction if.

Quoi qu'il en soit?

J'apprécierais vraiment!

Merci à tous

+0

Pouvez-vous fournir les fichiers de test que vous utilisez pour cet arbre? – rwilliams

Répondre

8

J'ai finalement réussi à faire fonctionner ça. Le principe de base est que vous allez utiliser le labels/nodelist pour construire votre node_sizes. De cette façon, ils corrèlent correctement. Je suis sûr qu'il me manque des options importantes pour que l'arbre soit 100% mais il semble que les tailles de nœuds apparaissent correctement.

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

Résultant Arbre alt text

+0

En fait, j'ai aussi essayé et ça fait la même chose. Je peux fournir le fichier de test mais il est peut-être trop grand pour le montrer ici – pavid

+0

Essayez Pastie.org et choisissez html/xml comme le type – rwilliams

+0

c'est dans la question. merci :) – pavid