2010-10-29 19 views
6

Estoy tratando de construir un árbol con BioPython, módulo Phylo.
Lo que he hecho hasta ahora es esta imagen: alt textPhylo BioPython construyendo árboles

cada nombre tiene un número de cuatro dígitos seguido de - y un número: este número se refiere al número de veces que se representa esa secuencia. Eso significa 1578 - 22, ese nodo debería representar 22secuencias.

el archivo con las secuencias alineadas: file
el archivo con la distancia para construir un árbol: file

Así que ahora me di a conocer cómo cambiar cada tamaño del nodo. Cada nodo tiene un tamaño diferente, esto está haciendo fácil una matriz de los diferentes valores:

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

Pero la matriz es arbitrario, me gustaría poner el tamaño de nodo correcto en el nodo de la derecha, he intentado esto:

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

pero no aparece nada cuando uso la instrucción if.

De todos modos de hacer esto?

¡Realmente lo agradecería!

Gracias a todos

+0

¿Puede dar los archivos de prueba que se está usando para ese árbol? – rwilliams

Respuesta

8

Finalmente conseguí esto funcionando. La premisa básica es que vas a usar el labels/nodelist para construir tu node_sizes. De esta manera se correlacionan adecuadamente. Estoy seguro de que me faltan algunas opciones importantes para que el árbol se vea al 100%, pero parece que los tamaños de nodo se muestran correctamente.

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

el árbol generado alt text

+0

En realidad, también lo intenté y hace lo mismo. Puedo proporcionar el archivo de prueba, pero quizás es demasiado grande para mostrarlo aquí – pavid

+0

Pruebe Pastie.org y elija html/xml como el tipo – rwilliams

+0

en la pregunta. gracias :) – pavid