Skip to content

Commit 788e862

Browse files
committed
[ENH] Test and Score: Allow choosing columns
1 parent 3258354 commit 788e862

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

Orange/widgets/evaluate/owtestlearners.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import numpy as np
88

99
from AnyQt import QtGui
10-
from AnyQt.QtWidgets import QHeaderView, QStyledItemDelegate
10+
from AnyQt.QtWidgets import QHeaderView, QStyledItemDelegate, QMenu
1111
from AnyQt.QtGui import QStandardItemModel, QStandardItem
1212
from AnyQt.QtCore import Qt, QSize
1313

@@ -170,6 +170,10 @@ class OWTestLearners(OWWidget):
170170
TARGET_AVERAGE = "(Average over classes)"
171171
class_selection = settings.ContextSetting(TARGET_AVERAGE)
172172

173+
shown_scores = \
174+
settings.Setting({"AUC", "CA", "F1", "Precision", "Recall",
175+
"MSE", "RMSE", "MAE", "R2"})
176+
173177
class Error(OWWidget.Error):
174178
train_data_empty = Msg("Train data set is empty.")
175179
test_data_empty = Msg("Test data set is empty.")
@@ -261,6 +265,8 @@ def __init__(self):
261265
header.setSectionResizeMode(QHeaderView.ResizeToContents)
262266
header.setDefaultAlignment(Qt.AlignCenter)
263267
header.setStretchLastSection(False)
268+
header.setContextMenuPolicy(Qt.CustomContextMenu)
269+
header.customContextMenuRequested.connect(self.show_column_chooser)
264270

265271
self.result_model = QStandardItemModel(self)
266272
self.result_model.setHorizontalHeaderLabels(["Method"])
@@ -546,6 +552,16 @@ def _update_header(self):
546552
self.result_model.takeColumn(i)
547553

548554
self.result_model.setHorizontalHeaderLabels(headers)
555+
self._update_shown_columns()
556+
557+
def _update_shown_columns(self):
558+
# pylint doesn't know that self.shown_scores is a set, not a Setting
559+
# pylint: disable=unsupported-membership-test
560+
model = self.result_model
561+
header = self.view.horizontalHeader()
562+
for section in range(1, model.columnCount()):
563+
col_name = model.horizontalHeaderItem(section).data(Qt.DisplayRole)
564+
header.setSectionHidden(section, col_name not in self.shown_scores)
549565

550566
def _update_stats_model(self):
551567
# Update the results_model with up to date scores.
@@ -660,6 +676,25 @@ def _invalidate(self, which=None):
660676

661677
self.commit()
662678

679+
def show_column_chooser(self, pos):
680+
def update(col_name, state):
681+
if state:
682+
self.shown_scores.add(col_name)
683+
else:
684+
self.shown_scores.remove(col_name)
685+
self._update_shown_columns()
686+
687+
menu = QMenu()
688+
model = self.result_model
689+
header = self.view.horizontalHeader()
690+
for section in range(1, model.columnCount()):
691+
col_name = model.horizontalHeaderItem(section).data(Qt.DisplayRole)
692+
action = menu.addAction(col_name)
693+
action.setCheckable(True)
694+
action.setChecked(col_name in self.shown_scores)
695+
action.triggered.connect(functools.partial(update, col_name))
696+
menu.exec(header.mapToGlobal(pos))
697+
663698
def commit(self):
664699
"""Recompute and output the results"""
665700
self._update_header()
@@ -840,6 +875,7 @@ def main(argv=None):
840875
for i in range(len(learners)):
841876
w.set_learner(None, i)
842877
w.handleNewSignals()
878+
w.saveSettings()
843879
return rval
844880

845881
if __name__ == "__main__":

0 commit comments

Comments
 (0)