Как изменить ориентацию шрифта на ярлыках узлов с помощью ETE Toolkit (Python)
Я хотел бы изменить ориентацию граней шрифта на выходном изображении, которое создается ETE Toolkit: http://etetoolkit.org/
По некоторым причинам поворот и изменение ориентации не влияют на метки, как показано на рисунке ниже:
Код для создания этого примера на ноутбуке Jupiter следующий:
from ete3 import Tree, TreeStyle
def draw_ete(newick):
t = Tree(newick)
ts = TreeStyle()
ts.scale = 5
ts.rotation = -90
ts.orientation = 1
return t.render("%%inline", tree_style=ts)
newick = """((p, e, a, s, ((e, _), p, o), r, r, i, d, g, (e, _)), (h, o, t), ((,, ↵), (p, e, a, s, ((e, _), p, o), r, r, i, d, g, (e, _))), (c, (o, l, d)), ((,, ↵), (p, e, a, s, ((e, _), p, o), r, r, i, d, g, (e, _))), ((i, n), _, t, h, ((e, _), p, o), t, (,, ↵), n, (i, n), (e, _), d, a, y, s, _, (o, l, d), .), ↵, ↵, (s, o, m, (e, _), l, i, k, (e, _), i, t, _), (h, o, t), ((,, ↵), (s, o, m, (e, _), l, i, k, (e, _), i, t, _)), (c, (o, l, d)), ((,, ↵), (s, o, m, (e, _), l, i, k, (e, _), i, t, _)), ((i, n), _, t, h, ((e, _), p, o), t, (,, ↵), n, (i, n), (e, _), d, a, y, s, _, (o, l, d), .));"""
draw_ete(newick)
Я также хотел бы знать, возможно ли разделить вывод на несколько строк вместо одной строки? Длинные последовательности имеют тенденцию занимать огромное пространство по ширине, поэтому было бы целесообразно разделить последовательность на несколько строк.
1 ответ
Ответ из списка рассылки etetoolkit:
1) вращение возможно при использовании пользовательских макетов и TextFaces. Проверьте этот пример:
from ete3 import Tree, TreeStyle, add_face_to_node, TextFace
from random import randint
def rotation_layout(node):
if node.is_leaf():
F = TextFace(node.name, tight_text=True)
F.rotation = randint(0, 360)
add_face_to_node(TextFace("third" ), node, column=8, position="branch-right")
add_face_to_node(TextFace("second" ), node, column=2, position="branch-right")
add_face_to_node(F, node, column=0, position="branch-right")
F.border.width = 1
F.inner_border.width = 1
def get_example_tree():
t = Tree()
t.populate(10)
ts = TreeStyle()
ts.rotation = 45
ts.show_leaf_name = False
ts.layout_fn = rotation_layout
return t, ts
if __name__ == "__main__":
t, ts = get_example_tree()
t.show(tree_style=ts)
2) разбить на несколько строк: я не совсем понимаю ваш вопрос, но, если спросить об уменьшении ширины конечного изображения дерева, единственным способом будет разделить чертеж на несколько вызовов рендеринга, по одному на узел, который вы хотите рисовать. Например. Чтобы разделить одно дерево на два независимых изображения, вы можете запустить:
t.children[0].render("left_side.png")
t.children[1].render("right_side.png")
3) Вы имеете в виду масштаб ветви внизу? Вы можете установить TreeStyle.show_scale=False