Skip to content

Commit af0f2d7

Browse files
committed
DataProjectionWidget: Warn about invalid subset data
1 parent 4f99ad0 commit af0f2d7

File tree

2 files changed

+55
-4
lines changed

2 files changed

+55
-4
lines changed

Orange/widgets/visualize/tests/test_owprojectionwidget.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Test methods with long descriptive names can omit docstrings
22
# pylint: disable=missing-docstring
3+
import unittest
34
from unittest.mock import patch
45

56
import numpy as np
@@ -164,3 +165,39 @@ def test_too_many_labels(self):
164165

165166
self.widget.graph.too_many_labels.emit(False)
166167
self.assertFalse(w.is_shown())
168+
169+
def test_invalid_subset(self):
170+
widget = self.widget
171+
172+
data = Table("iris")
173+
self.send_signal(widget.Inputs.data_subset, data[40:60])
174+
self.assertFalse(widget.Warning.subset_independent.is_shown())
175+
self.assertFalse(widget.Warning.subset_not_subset.is_shown())
176+
177+
self.send_signal(widget.Inputs.data, data[30:70])
178+
self.assertFalse(widget.Warning.subset_independent.is_shown())
179+
self.assertFalse(widget.Warning.subset_not_subset.is_shown())
180+
181+
self.send_signal(widget.Inputs.data, data[30:50])
182+
self.assertFalse(widget.Warning.subset_independent.is_shown())
183+
self.assertTrue(widget.Warning.subset_not_subset.is_shown())
184+
185+
self.send_signal(widget.Inputs.data, data[20:30])
186+
self.assertTrue(widget.Warning.subset_independent.is_shown())
187+
self.assertFalse(widget.Warning.subset_not_subset.is_shown())
188+
189+
self.send_signal(widget.Inputs.data, data[30:70])
190+
self.assertFalse(widget.Warning.subset_independent.is_shown())
191+
self.assertFalse(widget.Warning.subset_not_subset.is_shown())
192+
193+
self.send_signal(widget.Inputs.data, data[30:50])
194+
self.assertFalse(widget.Warning.subset_independent.is_shown())
195+
self.assertTrue(widget.Warning.subset_not_subset.is_shown())
196+
197+
self.send_signals([(widget.Inputs.data, Table("titanic")),
198+
(widget.Inputs.data_subset, None)])
199+
self.assertFalse(widget.Warning.subset_independent.is_shown())
200+
self.assertFalse(widget.Warning.subset_not_subset.is_shown())
201+
202+
if __name__ == "__main__":
203+
unittest.main()

Orange/widgets/visualize/utils/widget.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,11 @@ class Outputs:
363363
class Warning(OWProjectionWidgetBase.Warning):
364364
too_many_labels = Msg(
365365
"Too many labels to show (zoom in or label only selected)")
366+
subset_not_subset = Msg(
367+
"Subset data contains some instances that do not appear in "
368+
"input data")
369+
subset_independent = Msg(
370+
"None of subset data instance appear in input data")
366371

367372
settingsHandler = DomainContextHandler()
368373
selection = Setting(None, schema_only=True)
@@ -463,10 +468,19 @@ def handleNewSignals(self):
463468
self.commit()
464469

465470
def get_subset_mask(self):
466-
if self.subset_indices:
467-
return np.array([ex.id in self.subset_indices
468-
for ex in self.data[self.valid_data]])
469-
return None
471+
self.Warning.subset_independent.clear()
472+
self.Warning.subset_not_subset.clear()
473+
if not self.subset_indices:
474+
return None
475+
valid_data = self.data[self.valid_data]
476+
mask = np.fromiter((ex.id in self.subset_indices for ex in valid_data),
477+
dtype=np.bool, count=len(valid_data))
478+
in_mask = mask.sum()
479+
if not in_mask:
480+
self.Warning.subset_independent()
481+
elif in_mask < len(self.subset_indices):
482+
self.Warning.subset_not_subset()
483+
return mask
470484

471485
# Plot
472486
def get_embedding(self):

0 commit comments

Comments
 (0)