Skip to content

Commit 9a4da3d

Browse files
authored
Merge pull request #4390 from ales-erjavec/heatmap-layout-aspect
[ENH] Heatmap: Tighter layout
2 parents c488819 + a63c8c1 commit 9a4da3d

File tree

1 file changed

+21
-28
lines changed

1 file changed

+21
-28
lines changed

Orange/widgets/visualize/owheatmap.py

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,9 @@ def enum_get(etype: Type[E], name: str, default: E) -> E:
215215
return default
216216

217217

218+
FLT_MAX = np.finfo(np.float32).max
219+
220+
218221
class OWHeatMap(widget.OWWidget):
219222
name = "Heat Map"
220223
description = "Plot a data matrix heatmap."
@@ -303,7 +306,7 @@ def _():
303306
self.row_clustering_method = self.row_clustering.name
304307

305308
# set default settings
306-
self.space_x = 10
309+
self.space_x = 3
307310

308311
self.colorSettings = None
309312
self.selectedSchemaIndex = 0
@@ -852,12 +855,13 @@ def setup_scene(self, parts, data):
852855
Col0 = 3
853856
LegendRow = 0
854857
# The column for the vertical dendrogram
855-
DendrogramColumn = 0
858+
DendrogramColumn = 1
856859
# The row for the horizontal dendrograms
857860
DendrogramRow = 1
858861
RightLabelColumn = Col0 + M
859862
TopLabelsRow = 2
860-
BottomLabelsRow = Row0 + 2 * N
863+
BottomLabelsRow = Row0 + N
864+
GroupTitleColumn = 0
861865

862866
widget.setLayout(grid)
863867

@@ -872,9 +876,9 @@ def setup_scene(self, parts, data):
872876
for i, rowitem in enumerate(parts.rows):
873877
if rowitem.title:
874878
title = QGraphicsSimpleTextItem(rowitem.title, widget)
875-
item = GraphicsSimpleTextLayoutItem(title, parent=grid)
876-
item.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
877-
grid.addItem(item, Row0 + i * 2, Col0)
879+
item = GraphicsSimpleTextLayoutItem(title, orientation=Qt.Vertical, parent=grid)
880+
item.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Maximum)
881+
grid.addItem(item, Row0 + i, GroupTitleColumn, alignment=Qt.AlignCenter)
878882

879883
if rowitem.cluster:
880884
dendrogram = DendrogramWidget(
@@ -893,7 +897,7 @@ def setup_scene(self, parts, data):
893897
self.__select_by_cluster(item, partindex)
894898
)
895899

896-
grid.addItem(dendrogram, Row0 + i * 2 + 1, DendrogramColumn)
900+
grid.addItem(dendrogram, Row0 + i, DendrogramColumn)
897901
sort_i.append(np.array(leaf_indices(rowitem.cluster)))
898902
row_dendrograms[i] = dendrogram
899903
else:
@@ -945,8 +949,8 @@ def setup_scene(self, parts, data):
945949
hw.set_show_averages(self.averages)
946950
hw.set_heatmap_data(X_part)
947951

948-
grid.addItem(hw, Row0 + i * 2 + 1, Col0 + j)
949-
grid.setRowStretchFactor(Row0 + i * 2 + 1, X_part.shape[0] * 100)
952+
grid.addItem(hw, Row0 + i, Col0 + j)
953+
grid.setRowStretchFactor(Row0 + i, X_part.shape[0] * 100)
950954
heatmap_row.append(hw)
951955
heatmap_widgets.append(heatmap_row)
952956

@@ -974,7 +978,7 @@ def setup_scene(self, parts, data):
974978
labelslist.setContentsMargins(0.0, 0.0, 0.0, 0.0)
975979
labelslist.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding)
976980

977-
grid.addItem(labelslist, Row0 + i * 2 + 1, RightLabelColumn)
981+
grid.addItem(labelslist, Row0 + i, RightLabelColumn)
978982
grid.setAlignment(labelslist, Qt.AlignLeft)
979983
row_annotation_widgets.append(labelslist)
980984

@@ -1056,8 +1060,7 @@ def __update_size_constraints(self):
10561060
if mode == Qt.IgnoreAspectRatio:
10571061
# Reset the row height constraints ...
10581062
for i, hm_row in enumerate(self.heatmap_widget_grid):
1059-
layout.setRowMaximumHeight(3 + i * 2 + 1, np.finfo(np.float32).max)
1060-
layout.setRowPreferredHeight(3 + i * 2 + 1, 0)
1063+
layout.setRowMaximumHeight(3 + i, FLT_MAX)
10611064
# ... and resize to match the viewport, taking the minimum size
10621065
# into account
10631066
minsize = widget.minimumSize()
@@ -1087,8 +1090,8 @@ def __update_size_constraints(self):
10871090
Qt.KeepAspectRatioByExpanding)
10881091

10891092
heights.append(hm_size.height())
1090-
layout.setRowMaximumHeight(3 + i * 2 + 1, max(heights))
1091-
layout.setRowPreferredHeight(3 + i * 2 + 1, max(heights))
1093+
layout.setRowMaximumHeight(3 + i, max(heights))
1094+
layout.setRowPreferredHeight(3 + i, max(heights))
10921095

10931096
# set/update the widget's height
10941097
constraint = QSizeF(size.width(), -1)
@@ -1356,20 +1359,8 @@ def update_column_annotations(self):
13561359

13571360
for labelslist in self.col_annotation_widgets_top:
13581361
labelslist.setVisible(show_top)
1359-
1360-
TopLabelsRow = 2
1361-
Row0 = 3
1362-
BottomLabelsRow = Row0 + 2 * len(self.heatmapparts.rows)
1363-
1364-
layout = self.heatmap_scene.widget.layout()
1365-
layout.setRowMaximumHeight(TopLabelsRow, -1 if show_top else 0)
1366-
layout.setRowSpacing(TopLabelsRow, -1 if show_top else 0)
1367-
13681362
for labelslist in self.col_annotation_widgets_bottom:
13691363
labelslist.setVisible(show_bottom)
1370-
1371-
layout.setRowMaximumHeight(BottomLabelsRow, -1 if show_top else 0)
1372-
13731364
self.__fixup_grid_layout()
13741365

13751366
def __select_by_cluster(self, item, dendrogramindex):
@@ -1690,8 +1681,9 @@ def _update_pixmap(self):
16901681

16911682
self.heatmap_item.setMinimumSize(hmsize)
16921683
self.averages_item.setMinimumSize(avsize)
1693-
self.heatmap_item.setPreferredSize(hmsize * 10)
1694-
self.averages_item.setPreferredSize(avsize * 10)
1684+
size = QFontMetrics(self.font()).lineSpacing()
1685+
self.heatmap_item.setPreferredSize(hmsize * size)
1686+
self.averages_item.setPreferredSize(avsize * size)
16951687
self.layout().invalidate()
16961688

16971689
def cell_at(self, pos):
@@ -1925,6 +1917,7 @@ def __init__(self, low, high, threshold_low, threshold_high, parent=None):
19251917
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
19261918
self.__pixitem = GraphicsPixmapWidget(parent=self, scaleContents=True,
19271919
aspectMode=Qt.IgnoreAspectRatio)
1920+
self.__pixitem.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Preferred)
19281921
self.__pixitem.setMinimumHeight(12)
19291922
layout.addItem(self.__pixitem)
19301923
self.__update()

0 commit comments

Comments
 (0)