Skip to content

Commit bebda4c

Browse files
committed
Scatterplot: Enable/disable vizrank button
1 parent c4c81a4 commit bebda4c

File tree

2 files changed

+68
-9
lines changed

2 files changed

+68
-9
lines changed

Orange/widgets/visualize/owscatterplot.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -301,15 +301,19 @@ def effective_variables(self):
301301

302302
def _vizrank_color_change(self):
303303
self.vizrank.initialize()
304-
is_enabled = self.data is not None and not self.data.is_sparse() and \
305-
len(self.xy_model) > 2 and len(self.data[self.valid_data]) > 1 \
306-
and np.all(np.nan_to_num(np.nanstd(self.data.X, 0)) != 0)
307-
self.vizrank_button.setEnabled(
308-
is_enabled and self.attr_color is not None and
309-
not np.isnan(self.data.get_column_view(
310-
self.attr_color)[0].astype(float)).all())
311-
text = "Color variable has to be selected." \
312-
if is_enabled and self.attr_color is None else ""
304+
text, is_enabled = "", True
305+
if self.data is None:
306+
text, is_enabled = "No data on input", False
307+
elif self.data.is_sparse():
308+
text, is_enabled = "Data is sparse", False
309+
elif len(self.xy_model) < 3:
310+
text, is_enabled = "Not enough features for ranking", False
311+
elif self.attr_color is None:
312+
text, is_enabled = "Color variable has to be selected", False
313+
elif np.isnan(self.data.get_column_view(
314+
self.attr_color)[0].astype(float)).all():
315+
text, is_enabled = "Color variable has no values", False
316+
self.vizrank_button.setEnabled(is_enabled)
313317
self.vizrank_button.setToolTip(text)
314318

315319
def set_data(self, data):

Orange/widgets/visualize/tests/test_owscatterplot.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,61 @@ def test_vizrank_nonprimitives(self):
397397
new=lambda *_1, **_2: lambda data: np.arange(len(data))):
398398
self.widget.vizrank.score_heuristic()
399399

400+
def test_vizrank_enabled(self):
401+
self.send_signal(self.widget.Inputs.data, self.data)
402+
self.assertTrue(self.widget.vizrank_button.isEnabled())
403+
self.assertEqual(self.widget.vizrank_button.toolTip(), "")
404+
self.assertTrue(self.widget.vizrank.button.isEnabled())
405+
self.widget.vizrank.button.click()
406+
407+
def test_vizrank_enabled_no_data(self):
408+
self.send_signal(self.widget.Inputs.data, None)
409+
self.assertFalse(self.widget.vizrank_button.isEnabled())
410+
self.assertEqual(self.widget.vizrank_button.toolTip(), "No data on input")
411+
412+
def test_vizrank_enabled_sparse_data(self):
413+
self.send_signal(self.widget.Inputs.data, self.data.to_sparse())
414+
self.assertFalse(self.widget.vizrank_button.isEnabled())
415+
self.assertEqual(self.widget.vizrank_button.toolTip(), "Data is sparse")
416+
417+
def test_vizrank_enabled_constant_data(self):
418+
domain = Domain([ContinuousVariable("c1"),
419+
ContinuousVariable("c2"),
420+
ContinuousVariable("c3"),
421+
ContinuousVariable("c4")],
422+
DiscreteVariable("cls", values=["a", "b"]))
423+
X = np.zeros((10, 4))
424+
table = Table(domain, X, np.random.randint(2, size=10))
425+
self.send_signal(self.widget.Inputs.data, table)
426+
self.assertEqual(self.widget.vizrank_button.toolTip(), "")
427+
self.assertTrue(self.widget.vizrank_button.isEnabled())
428+
self.assertTrue(self.widget.vizrank.button.isEnabled())
429+
self.widget.vizrank.button.click()
430+
431+
def test_vizrank_enabled_two_features(self):
432+
self.send_signal(self.widget.Inputs.data, self.data[:, 2:])
433+
self.assertFalse(self.widget.vizrank_button.isEnabled())
434+
self.assertEqual(self.widget.vizrank_button.toolTip(),
435+
"Not enough features for ranking")
436+
437+
def test_vizrank_enabled_no_color_var(self):
438+
self.send_signal(self.widget.Inputs.data, self.data[:, :3])
439+
self.assertFalse(self.widget.vizrank_button.isEnabled())
440+
self.assertEqual(self.widget.vizrank_button.toolTip(),
441+
"Color variable has to be selected")
442+
443+
def test_vizrank_enabled_color_var_nans(self):
444+
domain = Domain([ContinuousVariable("c1"),
445+
ContinuousVariable("c2"),
446+
ContinuousVariable("c3"),
447+
ContinuousVariable("c4")],
448+
DiscreteVariable("cls", values=["a", "b"]))
449+
table = Table(domain, np.random.random((10, 4)), np.full(10, np.nan))
450+
self.send_signal(self.widget.Inputs.data, table)
451+
self.assertFalse(self.widget.vizrank_button.isEnabled())
452+
self.assertEqual(self.widget.vizrank_button.toolTip(),
453+
"Color variable has no values")
454+
400455
def test_auto_send_selection(self):
401456
"""
402457
Scatter Plot automatically sends selection only when the checkbox Send automatically

0 commit comments

Comments
 (0)