Frage

ich versucht, einen Baum mit biopython, Phylo Modul zu bauen.
Was ich bisher getan ist dieses Bild: alt text

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

War es hilfreich?

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 alt text

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top