Skip to content

Commit 1d3c728

Browse files
authored
Merge pull request #5514 from janezd/hierarchical-annotate-vars
[ENH] Hierarchical Clustering: Annotate variables with clusters
2 parents c326cea + 72e2451 commit 1d3c728

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

Orange/widgets/unsupervised/owhierarchicalclustering.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -610,16 +610,29 @@ def commit(self):
610610
selected_data.domain = Domain(
611611
attrs, classes, metas + (clust_var, ))
612612

613+
annotated_data = create_annotated_table(data, selected_indices)
614+
613615
elif isinstance(items, Orange.data.Table) and self.matrix.axis == 0:
614616
# Select columns
617+
attrs = []
618+
for clust, indices in chain(enumerate(maps, start=1),
619+
[(0, unselected_indices)]):
620+
for i in indices:
621+
attr = items.domain[i].copy()
622+
attr.attributes["cluster"] = clust
623+
attrs.append(attr)
615624
domain = Orange.data.Domain(
616-
[items.domain[i] for i in selected_indices],
625+
# len(unselected_indices) can be 0
626+
attrs[:len(attrs) - len(unselected_indices)],
617627
items.domain.class_vars, items.domain.metas)
618628
selected_data = items.from_table(domain, items)
619-
data = None
629+
630+
domain = Orange.data.Domain(
631+
attrs,
632+
items.domain.class_vars, items.domain.metas)
633+
annotated_data = items.from_table(domain, items)
620634

621635
self.Outputs.selected_data.send(selected_data)
622-
annotated_data = create_annotated_table(data, selected_indices)
623636
self.Outputs.annotated_data.send(annotated_data)
624637

625638
def eventFilter(self, obj, event):

Orange/widgets/unsupervised/tests/test_owhierarchicalclustering.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ def setUpClass(cls):
2626
cls.signal_data = cls.distances
2727
cls.same_input_output_domain = False
2828

29+
cls.distances_cols = Euclidean(cls.data, axis=0)
30+
2931
def setUp(self):
3032
self.widget = self.create_widget(OWHierarchicalClustering)
3133

@@ -35,6 +37,11 @@ def _select_data(self):
3537
self.widget.dendrogram.set_selected_items([cluster])
3638
return [14, 15, 32, 33]
3739

40+
def _select_data_columns(self):
41+
items = self.widget.dendrogram._items
42+
cluster = items[sorted(list(items.keys()))[5]]
43+
self.widget.dendrogram.set_selected_items([cluster])
44+
3845
def _compare_selected_annotated_domains(self, selected, annotated):
3946
self.assertEqual(annotated.domain.variables,
4047
selected.domain.variables)
@@ -170,3 +177,17 @@ def test_restore_state(self):
170177
self.send_signal(w.Inputs.distances, self.distances, widget=w)
171178
ids_2 = self.get_output(w.Outputs.selected_data, widget=w).ids
172179
self.assertSequenceEqual(list(ids_1), list(ids_2))
180+
181+
def test_column_distances(self):
182+
self.send_signal(self.widget.Inputs.distances, self.distances_cols)
183+
self._select_data_columns()
184+
o = self.get_output(self.widget.Outputs.annotated_data)
185+
annotated = [(a.name, a.attributes['cluster']) for a in o.domain.attributes]
186+
self.assertEqual(annotated, [('sepal width', 1), ('petal length', 1),
187+
('sepal length', 0), ('petal width', 0)])
188+
189+
self.widget.selection_box.buttons[2].click() # top N
190+
o = self.get_output(self.widget.Outputs.annotated_data)
191+
annotated = [(a.name, a.attributes['cluster']) for a in o.domain.attributes]
192+
self.assertEqual(annotated, [('sepal length', 1), ('petal width', 2),
193+
('sepal width', 3), ('petal length', 3)])

0 commit comments

Comments
 (0)