Как изменить ориентацию шрифта на ярлыках узлов с помощью ETE Toolkit (Python)

Я хотел бы изменить ориентацию граней шрифта на выходном изображении, которое создается ETE Toolkit: http://etetoolkit.org/

По некоторым причинам поворот и изменение ориентации не влияют на метки, как показано на рисунке ниже:

ETE

Код для создания этого примера на ноутбуке 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

Другие вопросы по тегам