我阅读了所有关于侧面热图生成的文档,但我找不到任何方法来向ete3生成的热图添加标签。例如,在下面的代码中,热图的7列具有名称'Marker1‘到'Marker7’。有没有办法将这些名字添加到ete3生成的热图中,就像“BarChartFace”中的“labels”选项一样?或者,唯一的方法是将树移植到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)现在它生成了一个类似这样的树,但我需要向每个热图列添加标签。

发布于 2021-06-02 21:18:30
部分答案:
我找不到这样做的方法,但是您可能对TreeStyle的aligned_header和aligned_foot属性感兴趣
假设您成功地创建了一个轴作为面,名为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)但是矩形不能正确地与每个热图列对齐。
https://stackoverflow.com/questions/51366712
复制相似问题