arbres de construction phylo biopython
Question
J'essaie de construire un arbre avec le module biopython, Phylo.
Ce que je l'ai fait jusqu'à présent est cette image:
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 que 1578 -. 22, ce nœud doit représenter 22sequences
le fichier avec les séquences alignées: fichier
le fichier avec la distance pour construire un arbre:
Alors maintenant, je connu 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 ne semble quand j'utilise l'instruction if.
De toute façon de le faire?
Je voudrais vraiment apprécier!
Merci tout le monde
La solution
Je suis enfin ce travail. 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 que je manque quelques options importantes pour rendre le look arbre à 100%, mais il semble que les tailles des noeuds affichent 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()
Arbre résultant