Skip to content

Commit 75ba902

Browse files
authored
Merge pull request #108 from dengzq1234/desktop_v2
Desktop v2
2 parents b741e8e + 8ca5ff3 commit 75ba902

File tree

10 files changed

+1234
-266
lines changed

10 files changed

+1234
-266
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,12 @@ TreeProfiler requires
106106
- webdriver_manager
107107
- pyvirtualdisplay
108108

109-
### Quick install via pip
109+
### Quick Install Environment
110110
```
111+
# create environment
112+
conda create -n treeprofiler python=3.10
113+
conda activate treeprofiler
114+
111115
# Install ETE Toolkit v4
112116
pip install --force-reinstall https://github.com/etetoolkit/ete/archive/ete4.zip
113117

treeprofiler/app.py

Lines changed: 641 additions & 113 deletions
Large diffs are not rendered by default.

treeprofiler/layouts/profile_layouts.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,6 @@ def get_array(self, node):
357357

358358
def set_node_style(self, node):
359359
array = self.get_array(node)
360-
#array = self.get_array(node)
361360
if array:
362361
if not self.is_list:
363362
if len(self.matrix_props) > 1:
@@ -835,7 +834,7 @@ def __init__(self, seq, value2color=None,
835834
self.seq = seq
836835
self.seqlength = len(self.seq)
837836
self.value2color = value2color
838-
self.absence_color = '#EBEBEB'
837+
self.absence_color = value2color.get(None, '#EBEBEB') if value2color else '#EBEBEB'
839838

840839
self.autoformat = True # block if 1px contains > 1 tile
841840

treeprofiler/layouts/staple_layouts.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ def __init__(self, name=None, prop=None, width=200, size_prop=None,
7070
self.size_prop = size_prop
7171
self.color_prop = color_prop
7272
self.size_range = size_range
73-
self.size_range = size_range
7473

7574
self.color = color
7675
self.colors = colors
@@ -145,6 +144,7 @@ def get_size(self, node, prop):
145144
if not self.size_prop:
146145
return self.width
147146
minval, maxval = self.size_range
147+
148148
return float(node.props.get(prop, 0)) / maxval * self.width
149149

150150
def get_color(self, node):
@@ -302,6 +302,7 @@ def set_tree_style(self, tree, tree_style):
302302
)
303303
def set_node_style(self, node):
304304
heatmap_num = node.props.get(self.prop)
305+
305306
if heatmap_num is not None and heatmap_num != 'NaN':
306307
heatmap_num = float(heatmap_num)
307308
if node.is_leaf:
@@ -318,7 +319,7 @@ def set_node_style(self, node):
318319
color=gradient_color, padding_x=self.padding_x, padding_y=self.padding_y, tooltip=tooltip)
319320
node.add_face(identF, column = self.column, position = 'aligned')
320321

321-
elif node.is_leaf and node.props.get(self.internal_prop):
322+
elif node.is_leaf and node.props.get(self.internal_prop) is not None:
322323
heatmap_num = node.props.get(self.internal_prop)
323324
heatmap_num = float(heatmap_num)
324325
# heatmap
@@ -335,7 +336,7 @@ def set_node_style(self, node):
335336
color=gradient_color, padding_x=self.padding_x, padding_y=self.padding_y, tooltip=tooltip)
336337
node.add_face(identF, column = self.column, position = 'aligned', collapsed_only=True)
337338

338-
elif node.props.get(self.internal_prop):
339+
elif node.props.get(self.internal_prop) is not None:
339340
heatmap_num = node.props.get(self.internal_prop)
340341
heatmap_num = float(heatmap_num)
341342
# heatmap
@@ -570,7 +571,7 @@ def __init__(self, name=None, prop=None, position="aligned",
570571
bubble_range=[], color_range=[], internal_rep='avg',
571572
scale=True, legend=True, active=True):
572573

573-
name = name or f'Bubble_{prop}'
574+
name = name or f'NumericalBubble_{prop}'
574575
super().__init__(name)
575576

576577
self.aligned_faces = True

treeprofiler/layouts/text_layouts.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ def set_node_style(self, node):
363363
tooltip += f'<br>{self.prop}: {prop_text}<br>'
364364

365365
if self.color_dict:
366-
color = self.color_dict.get(str(prop_text),"")
366+
color = self.color_dict.get(prop_text,"")
367367
prop_face = RectFace(width=self.width, height=self.height, color=color, \
368368
padding_x=self.padding_x , padding_y=self.padding_y, tooltip=tooltip)
369369
node.add_face(prop_face, column=self.column, position="aligned")
@@ -458,7 +458,7 @@ def set_node_style(self, node):
458458
tooltip += f'<br>{self.prop}: {prop_text}<br>'
459459

460460
if self.color_dict:
461-
color = self.color_dict.get(str(prop_text), self.absence_color)
461+
color = self.color_dict.get(prop_text, self.absence_color)
462462
align_link_face = AlignLinkFace(width=self.width*2, height=None,
463463
stroke_color=color, stroke_width=2, line_type=0, opacity=0.7)
464464
node.sm_style["bgcolor"] = color
@@ -487,7 +487,7 @@ def __init__(self, name=None, prop=None, position="branch_right",
487487
max_radius=1, padding_x=2, padding_y=0,
488488
scale=True, legend=True, active=True):
489489

490-
name = name or f'Bubble_{prop}'
490+
name = name or f'CategoricalBubble_{prop}'
491491
super().__init__(name)
492492

493493
self.aligned_faces = True
@@ -537,7 +537,7 @@ def set_node_style(self, node):
537537
# node.sm_style["fgopacity"] = self.fgopacity
538538
prop_face = CircleFace(radius=bubble_size, color=bubble_color,
539539
padding_x=self.padding_x, padding_y=self.padding_y)
540-
node.add_face(prop_face, column=0,
540+
node.add_face(prop_face, column=self.column,
541541
position="branch_right", collapsed_only=False)
542542

543543

treeprofiler/src/utils.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import matplotlib.colors as mcolors
1414
import numpy as np
1515
from scipy import stats
16+
import numbers
1617
import random
1718
import colorsys
1819
import operator
@@ -270,7 +271,23 @@ def get_internal_parser(internal_parser="name"):
270271
return 1
271272
elif internal_parser == "support":
272273
return 0
273-
274+
275+
def get_prop2type(node):
276+
output = {}
277+
prop2value = node.props
278+
if '_speciesFunction' in prop2value:
279+
del prop2value['_speciesFunction']
280+
281+
for prop, value in prop2value.items():
282+
if value != 'NaN':
283+
if isinstance(value, numbers.Number):
284+
output[prop] = float
285+
elif type(value) == list:
286+
output[prop] = list
287+
else:
288+
output[prop] = str
289+
return output
290+
274291
def ete4_parse(newick, internal_parser="name"):
275292
tree = PhyloTree(newick, parser=get_internal_parser(internal_parser))
276293
# Correct 0-dist trees
@@ -349,11 +366,6 @@ def conditional_prune(tree, conditions_input, prop2type):
349366
# n.dist = 1
350367
return tree
351368

352-
353-
#array = [n.props.get(prop) if n.props.get(prop) else 'NaN' for n in nodes]
354-
array = [n.props.get(prop) for n in nodes if n.props.get(prop) ]
355-
return array
356-
357369
# def _tree_prop_array(node, prop, leaf_only=False, numeric=False, list_type=False):
358370
# array = []
359371
# sep = '||'

0 commit comments

Comments
 (0)