فييلو بيوبيثون بناء أشجار
سؤال
أحاول بناء شجرة مع 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.
على أي حال من فعل هذا؟
سأقدر حقا!
شكرا لكم جميعا
المحلول
لقد حصلت أخيرًا على هذا العمل. الفرضية الأساسية هي أنك ستستخدم 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()
شجرة ناتجة