Добавление ярлыков к тепловым картам в ete3

Я прочитал всю документацию по созданию тепловой карты лица профиля, но я не мог найти способ добавить метки к тепловой карте, созданной ete3. Например, в следующем коде 7 столбцов тепловой карты имеют имена от "Marker1" до "Marker7". Есть ли способ добавить эти имена в тепловую карту, созданную ete3, что-то вроде опции "метки", доступной для "BarChartFace"? или единственный способ - портировать дерево на matplotlib и добавить туда метки?

from ete3 import Tree, TextFace, NodeStyle, TreeStyle, faces, AttrFace, ClusterTree, ProfileFace
PhenoDict={'a':1,'b':0,'c':1}
matrix = """
#Names\tmarker1\tmarker2\tmarker3\tmarker4\tmarker5\tmarker6\tmarker7
a\t1\t-1\t1\t-1\t-1\t-1\t1
b\t-1\t-1\t1\t1\t-1\t-1\t1
c\t1\t1\t1\t-1\t1\t1\t1
"""

t=ClusterTree( "((a,b),c);" , text_array=matrix)

#Defining a function to generate textFace for each node

def ColorCodedNode (node):
    if node.is_leaf():
        ColorCode=PhenoDict[node.name]

        if ColorCode == 0:
            faces.add_face_to_node(AttrFace('name',fsize=20,fgcolor='blue'), node, column=0,aligned=True)
column=1,position='aligned')
            faces.add_face_to_node(ProfileFace(1, -1, 0, width=200, height=40, style='heatmap', colorscheme=2),node,column=1,position='aligned')
        elif ColorCode == 1:
            faces.add_face_to_node(AttrFace("name",fsize=20,fgcolor='red'), node, column=0,aligned=True)
            faces.add_face_to_node(ProfileFace(1, -1, 0, width=200, height=40, style='heatmap', colorscheme=2),node,column=1,position='aligned')


ts = TreeStyle()
ts.layout_fn= ColorCodedNode
ts.show_scale = False
ts.show_leaf_name = False
ts.draw_guiding_lines=True
t.show(tree_style=ts)

Теперь он создает дерево, подобное этому, но мне нужно добавить метки в каждый столбец карты.

1 ответ

Частичный ответ:

Я не смог найти способ сделать это, однако, возможно, вас заинтересует aligned_header а также aligned_foot атрибуты TreeStyle:

Допустим, вам удалось создать ось в виде лица с именем axisface. Я считаю свой ответ частичным, потому что мое решение по созданию этого лица - несовершенный обходной путь, основанный на BarChartFace:

      from ete3 import BarChartFace

labels = matrix.split('\n')[1].split('\t')[1:]
axisface = BarChartFace([0]*len(labels), width=200, height=0, labels=labels, max_value=1, scale_fsize=1) # Can't get rid of the Y axis tick labels though

Затем вы можете добавить его к стопе / заголовку:

      ts.aligned_foot.add_face(axisface, 1)


В качестве альтернативы одному лицу вы можете создать по одному RectFace для каждой метки:

      from ete3 import RectFace

for i, lab in enumerate(labels):
    labface = RectFace(50, 200/len(labels), '#fff', '#eee', label={'text':lab, 'fontsize':8, 'color': 'black'})
    labface.rotation = -90
    ts.aligned_foot.add_face(labface, 1+i)

Но прямоугольники не выравниваются должным образом с каждым столбцом тепловой карты.

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