Phylo BioPython строит деревья

Я пытаюсь построить дерево с помощью модуля BioPython, Phylo.
На данный момент я сделал следующее изображение:   альтернативный текст

каждое имя имеет четырехзначное число, за которым следует - и число: это число указывает, сколько раз эта последовательность представлена. Это означает, что 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.

В любом случае делать это?

Я был бы очень признателен!

Спасибо всем


person psoares    schedule 29.10.2010    source источник
comment
Можете ли вы предоставить тестовые файлы, которые вы используете для этого дерева?   -  person rwilliams    schedule 02.11.2010


Ответы (1)


Я наконец получил это работает. Основная предпосылка заключается в том, что вы собираетесь использовать 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

person rwilliams    schedule 02.11.2010
comment
На самом деле я тоже пробовал это, и это делает то же самое. Я могу предоставить тестовый файл, но, возможно, он слишком велик, чтобы показать его здесь. - person psoares; 02.11.2010
comment
Попробуйте Pastie.org и выберите html/xml в качестве типа - person rwilliams; 02.11.2010
comment
Большое спасибо! Он работает просто отлично, на самом деле я вчера посмотрел на этот пример, но не смог его реализовать. Спасибо :) - person psoares; 03.11.2010
comment
извините, р-дуд, я забыл дать вам награду :) Спасибо за вашу помощь - person psoares; 03.11.2010
comment
извините за беспокойство, но что, если я хочу изменить цвет одного узла? Я пробовал что-то подобное, но выдает ошибку - person psoares; 04.11.2010
comment
Я мог бы поиграть с ним, хотя вы должны задать для него новый вопрос. - person rwilliams; 05.11.2010
comment
Вот тот же код с очень простой реализацией цвета pastie.org/1274064 - person rwilliams; 05.11.2010
comment
Спасибо, я понял, это была глупая ошибка. Спасибо за помощь - person psoares; 05.11.2010