Skip to content

Commit 8705073

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

File tree

2 files changed

+70
-11
lines changed

2 files changed

+70
-11
lines changed

Orange/widgets/visualize/owscatterplot.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def initialize(self):
4343

4444
def check_preconditions(self):
4545
self.Information.add_message(
46-
"color_required", "Color variable must be selected")
46+
"color_required", "Color variable is not selected")
4747
self.Information.color_required.clear()
4848
if not super().check_preconditions():
4949
return False
@@ -301,16 +301,20 @@ 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 ""
313-
self.vizrank_button.setToolTip(text)
304+
err_msg = ""
305+
if self.data is None:
306+
err_msg = "No data on input"
307+
elif self.data.is_sparse():
308+
err_msg = "Data is sparse"
309+
elif len(self.xy_model) < 3:
310+
err_msg = "Not enough features for ranking"
311+
elif self.attr_color is None:
312+
err_msg = "Color variable is not selected"
313+
elif np.isnan(self.data.get_column_view(
314+
self.attr_color)[0].astype(float)).all():
315+
err_msg = "Color variable has no values"
316+
self.vizrank_button.setEnabled(not err_msg)
317+
self.vizrank_button.setToolTip(err_msg)
314318

315319
def set_data(self, data):
316320
super().set_data(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 is not 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)