Phylo biopython Gebäude Bäume
Frage
ich versucht, einen Baum mit biopython, Phylo Modul zu bauen.
Was ich bisher getan ist dieses Bild:
Jeder Name hat eine vierstellige Zahl, gefolgt von - und eine Zahl: diese Zahl auf die Anzahl der Zeiten beziehen sich diese Sequenz dargestellt wird. Das bedeutet, dass 1578 -. 22, dass der Knoten sollte 22sequences darstellen
die Datei mit den Sequenzen ausgerichtet: Datei
die Datei mit dem Abstand, einen Baum zu bauen: Datei
So, jetzt ich weiß, wie jede Größe des Knotens zu ändern. Jeder Knoten hat eine andere Größe, dies ist eine Anordnung der verschiedenen Werte leicht tun:
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 beliebig, würde Ich mag die richtige 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 angezeigt wird, wenn ich die if-Anweisung verwendet werden.
Wie auch immer, dies zu tun?
Ich würde wirklich schätzen!
Vielen Dank alle
Lösung
Ich habe endlich diese Arbeit. Die Grundvoraussetzung ist, dass Sie die labels/nodelist
verwenden werden Ihre node_sizes
zu bauen. Auf diese Weise sie richtig korrelieren. Ich bin sicher, dass ich einige wichtige Optionen fehlt der Baum aussehen 100% zu machen, aber es erscheint die Knotengrößen richtig zeigen sich.
#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()
resultierender Baum