Coverage for /home/deng/Projects/metatree_drawer/metatreedrawer/treeprofiler/layouts/phylosignal_layouts.py: 17%
96 statements
« prev ^ index » next coverage.py v7.2.7, created at 2024-08-07 10:33 +0200
« prev ^ index » next coverage.py v7.2.7, created at 2024-08-07 10:33 +0200
1from ete4.smartview import TreeStyle, NodeStyle, TreeLayout, PieChartFace
2from ete4.smartview import RectFace, CircleFace, SeqMotifFace, TextFace, OutlineFace
3from treeprofiler.layouts.general_layouts import get_piechartface, get_stackedbarface
5class LayoutACRDiscrete(TreeLayout):
6 def __init__(self, name, column, color_dict, acr_prop, legend=True, width=70, padding_x=1, padding_y=0):
7 super().__init__(name)
8 self.aligned_faces = True
9 self.acr_prop = acr_prop
10 self.delta_prop = acr_prop+"_delta"
11 self.pval_prop = acr_prop+"_pval"
12 self.column = column
13 self.color_dict = color_dict
14 self.legend = legend
15 self.height = None
16 self.absence_color = "black"
17 self.width = width
18 self.padding_x = padding_x
19 self.padding_y = padding_y
21 def set_tree_style(self, tree, tree_style):
22 super().set_tree_style(tree, tree_style)
23 text = TextFace(self.acr_prop, min_fsize=5, max_fsize=15, padding_x=self.padding_x, width=self.width, rotation=315)
24 #tree_style.aligned_panel_header.add_face(text, column=self.column)
25 if self.legend:
26 if self.color_dict:
27 #self.color_dict["Undecided Ancestral Character State"] = self.absence_color
28 tree_style.add_legend(title=self.name,
29 variable='discrete',
30 colormap=self.color_dict
31 )
32 def format_p_value(self, pval):
33 if pval < 0.001:
34 return "P < 0.001"
35 elif pval < 0.01:
36 return f"P = {pval:.3f}"
37 else:
38 # Handle rounding issue for P values greater than .01
39 if 0.049 <= pval < 0.050 or 0.0049 <= pval < 0.005:
40 return f"P = {pval:.3f}"
41 else:
42 return f"P = {pval:.2f}"
44 def set_node_style(self, node):
45 if node.props.get(self.acr_prop):
46 prop_text = node.props.get(self.acr_prop)
47 if prop_text:
48 if type(prop_text) == list:
49 prop_text = ",".join(prop_text)
50 else:
51 pass
52 if self.color_dict:
53 node.add_face(TextFace(node.name, color = self.color_dict.get(prop_text,""),
54 padding_x=self.padding_x),column=0, position="branch_right")
55 node.sm_style["hz_line_color"] = self.color_dict.get(prop_text,"")
56 node.sm_style["hz_line_width"] = 3
57 node.sm_style["vt_line_color"] = self.color_dict.get(prop_text,"")
58 node.sm_style["vt_line_width"] = 3
59 node.sm_style["outline_color"] = self.color_dict.get(prop_text, self.absence_color)
60 node.sm_style["size"] = 4
61 node.sm_style["fgcolor"] = self.color_dict.get(prop_text, self.absence_color)
63 # # Delta statistic
64 if node.props.get(self.delta_prop):
65 prop_text = "%.2f" % float(node.props.get(self.delta_prop))
66 if prop_text:
67 output = u"\u0394" + f"-{self.acr_prop}: " + prop_text
68 node.add_face(TextFace(output, color = "red",
69 padding_x=self.padding_x*5), column=0, position="branch_right")
70 # p_value
71 if node.props.get(self.pval_prop) is not None:
72 pval = float(node.props.get(self.pval_prop))
74 prop_text = self.format_p_value(pval)
75 if prop_text:
76 node.add_face(TextFace(prop_text, color = "red",
77 padding_x=self.padding_x*5), column=0, position="branch_right")
79class LayoutACRContinuous(TreeLayout):
80 def __init__(self, name, column, color_dict, score_prop, value_range=None, color_range=None, legend=True):
81 super().__init__(name)
82 self.aligned_faces = True
83 self.score_prop = score_prop
84 self.color_dict = color_dict
85 self.legend = legend
86 self.absence_color = "black"
87 self.value_range = value_range
88 self.color_range = color_range
89 self.line_width = 5
91 def set_tree_style(self, tree, tree_style):
92 if self.legend:
93 if self.color_dict:
94 tree_style.add_legend(title=self.name,
95 variable='continuous',
96 value_range=self.value_range,
97 color_range=self.color_range,
98 )
100 def set_node_style(self, node):
101 prop_score = node.props.get(self.score_prop)
102 if prop_score:
103 prop_score = float(prop_score)
104 if self.color_dict:
105 # node.add_face(TextFace(node.name, color = self.color_dict.get(prop_text,""),
106 # padding_x=self.padding_x),column=0, position="branch_right")
107 node.sm_style["hz_line_color"] = self.color_dict.get(prop_score,"")
108 node.sm_style["hz_line_width"] = self.line_width
109 node.sm_style["vt_line_color"] = self.color_dict.get(prop_score,"")
110 node.sm_style["vt_line_width"] = self.line_width
111 node.sm_style["outline_color"] = self.color_dict.get(prop_score, self.absence_color)
113class LayoutLineageSpecific(TreeLayout):
114 def __init__(self, name, ls_prop, color, legend=True, active=True):
115 super().__init__(name)
116 self.ls_prop = ls_prop
117 self.color = color
118 self.legend = legend
119 self.active = active
120 def set_tree_style(self, tree, tree_style):
121 if self.legend:
123 tree_style.add_legend(title=self.name,
124 variable='discrete',
125 colormap={
126 self.ls_prop: self.color,
127 }
128 )
130 def set_node_style(self, node):
131 if node.props.get(self.ls_prop):
132 node.sm_style["bgcolor"] = self.color # highligh clade
133 node.sm_style["outline_color"] = self.color