سؤال

أحاول بناء شجرة مع Biopython ، وحدة Phylo.
ما فعلته حتى الآن هو هذه الصورة: alt text

يحتوي كل اسم على رقم أربعة أرقام متبوعًا - ورقم: يشير هذا الرقم إلى عدد المرات التي يتم فيها تمثيل التسلسل. وهذا يعني 1578 - 22 ، يجب أن تمثل تلك العقدة 22 سلسلة.

الملف مع التسلسلات المحاذاة: ملف
الملف مع المسافة لبناء شجرة: ملف

حتى الآن عرفت كيفية تغيير كل حجم من العقدة. كل عقدة لها حجم مختلف ، وهذا سهل القيام بمجموعة من القيم المختلفة:

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

لكن الصفيف تعسفي ، أود وضع حجم العقدة الصحيح في العقدة اليمنى ، جربت هذا:

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

ولكن لا شيء يظهر عندما أستخدم البيان if.

على أي حال من فعل هذا؟

سأقدر حقا!

شكرا لكم جميعا

هل كانت مفيدة؟

المحلول

لقد حصلت أخيرًا على هذا العمل. الفرضية الأساسية هي أنك ستستخدم labels/nodelist لبناء الخاص بك node_sizes. بهذه الطريقة يرتبطون بشكل صحيح. أنا متأكد من أنني أفتقد بعض الخيارات المهمة لجعل الشجرة تبدو 100 ٪ ولكن يبدو أن أحجام العقدة تظهر بشكل صحيح.

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

شجرة ناتجةalt text

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top