Skip to content

Commit 740409b

Browse files
authored
Merge pull request #4902 from aturanjanin/owsom
SOM: data info displayed in the status bar
2 parents ae9f778 + d4a99f9 commit 740409b

File tree

2 files changed

+32
-19
lines changed

2 files changed

+32
-19
lines changed

Orange/widgets/unsupervised/owsom.py

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
DomainContextHandler, ContextSetting, Setting
2323
from Orange.widgets.utils.itemmodels import DomainModel
2424
from Orange.widgets.utils.widgetpreview import WidgetPreview
25+
from Orange.widgets.utils.state_summary import format_summary_details
2526
from Orange.widgets.utils.annotated_data import \
2627
create_annotated_table, create_groups_table, ANNOTATED_DATA_SIGNAL_NAME
2728
from Orange.widgets.utils.colorpalettes import \
@@ -229,6 +230,9 @@ def __init__(self):
229230
self.selection = None
230231
self.colors = self.thresholds = self.bin_labels = None
231232

233+
self._set_input_summary(None)
234+
self._set_output_summary(None)
235+
232236
box = gui.vBox(self.controlArea, box="SOM")
233237
shape = gui.comboBox(
234238
box, self, "", items=("Hexagonal grid", "Square grid"))
@@ -353,25 +357,18 @@ def set_warnings():
353357
self.set_color_bins()
354358
self.create_legend()
355359
self.recompute_dimensions()
356-
self._set_input_summary(data and len(data))
360+
self._set_input_summary(data)
357361
self.start_som()
358362

359-
def _set_input_summary(self, n_tot):
360-
if self.data is None:
361-
self.info.set_input_summary(self.info.NoInput)
362-
return
363-
364-
n = len(self.data)
365-
inst = str(n)
366-
nvars = f"{self.cont_x.shape[1]} numeric variables"
367-
if n < n_tot:
368-
inst += f" ({n_tot})"
369-
details = f"{n_tot - n} out of {n_tot} instances ignored " \
370-
f"because of missing values;\n{nvars}"
371-
else:
372-
details = f"{n} instances; {nvars}"
363+
def _set_input_summary(self, data):
364+
summary = len(data) if data else self.info.NoInput
365+
details = format_summary_details(data) if data else ""
366+
self.info.set_input_summary(summary, details)
373367

374-
self.info.set_input_summary(inst, details)
368+
def _set_output_summary(self, output):
369+
summary = len(output) if output else self.info.NoOutput
370+
details = format_summary_details(output) if output else ""
371+
self.info.set_output_summary(summary, details)
375372

376373
def clear(self):
377374
self.data = self.cont_x = None
@@ -807,7 +804,7 @@ def update_output(self):
807804
if self.data is None:
808805
self.Outputs.selected_data.send(None)
809806
self.Outputs.annotated_data.send(None)
810-
self.info.set_output_summary(self.info.NoOutput)
807+
self._set_output_summary(None)
811808
return
812809

813810
indices = np.zeros(len(self.data), dtype=int)
@@ -820,10 +817,10 @@ def update_output(self):
820817
if np.any(indices):
821818
sel_data = create_groups_table(self.data, indices, False, "Group")
822819
self.Outputs.selected_data.send(sel_data)
823-
self.info.set_output_summary(str(len(sel_data)))
820+
self._set_output_summary(sel_data)
824821
else:
825822
self.Outputs.selected_data.send(None)
826-
self.info.set_output_summary(self.info.NoOutput)
823+
self._set_output_summary(None)
827824

828825
if np.max(indices) > 1:
829826
annotated = create_groups_table(self.data, indices)

Orange/widgets/unsupervised/tests/test_owsom.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from Orange.data import Table, Domain
1010
from Orange.widgets.tests.base import WidgetTest
1111
from Orange.widgets.utils.annotated_data import ANNOTATED_DATA_FEATURE_NAME
12+
from Orange.widgets.utils.state_summary import format_summary_details
1213
from Orange.widgets.unsupervised.owsom import OWSOM, SomView, SOM
1314

1415

@@ -508,6 +509,11 @@ def test_on_selection_change_on_empty(self):
508509
def test_output(self):
509510
widget = self.widget
510511
self.send_signal(self.widget.Inputs.data, self.iris)
512+
summary, details = f"{len(self.iris)}", format_summary_details(
513+
self.iris)
514+
self.assertEqual(widget.info._StateInfo__input_summary.brief, summary)
515+
self.assertEqual(widget.info._StateInfo__input_summary.details,
516+
details)
511517

512518
self.assertIsNone(self.get_output(widget.Outputs.selected_data))
513519
out = self.get_output(widget.Outputs.annotated_data)
@@ -520,6 +526,10 @@ def test_output(self):
520526
widget.on_selection_change(m)
521527
out = self.get_output(widget.Outputs.selected_data)
522528
np.testing.assert_equal(out.ids, self.iris.ids[:30])
529+
summary, details = f"{len(out)}", format_summary_details(out)
530+
self.assertEqual(widget.info._StateInfo__output_summary.brief, summary)
531+
self.assertEqual(widget.info._StateInfo__output_summary.details,
532+
details)
523533

524534
out = self.get_output(widget.Outputs.annotated_data)
525535
np.testing.assert_equal(
@@ -540,6 +550,12 @@ def test_output(self):
540550
self.send_signal(self.widget.Inputs.data, None)
541551
self.assertIsNone(self.get_output(widget.Outputs.selected_data))
542552
self.assertIsNone(self.get_output(widget.Outputs.annotated_data))
553+
self.assertEqual(widget.info._StateInfo__input_summary.brief, "")
554+
self.assertEqual(widget.info._StateInfo__input_summary.details,
555+
"No data on input")
556+
self.assertEqual(widget.info._StateInfo__output_summary.brief, "")
557+
self.assertEqual(widget.info._StateInfo__output_summary.details,
558+
"No data on output")
543559

544560

545561
if __name__ == "__main__":

0 commit comments

Comments
 (0)