Skip to content

Commit

Permalink
Box plot: Move 'order by importance' checkbox to groups
Browse files Browse the repository at this point in the history
  • Loading branch information
janezd committed Sep 25, 2019
1 parent 7e33526 commit 3241ee5
Showing 1 changed file with 35 additions and 40 deletions.
75 changes: 35 additions & 40 deletions Orange/widgets/visualize/owboxplot.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ def __init__(self):
self.scene_min_x = self.scene_max_x = self.scene_width = 0
self.label_width = 0

self.attrs = VariableListModel()
self.attrs = DomainModel(separators=False)
view = gui.listView(
self.controlArea, self, "attribute", box="Variable",
model=self.attrs, callback=self.attr_changed)
Expand All @@ -212,18 +212,16 @@ def __init__(self):
# set the minimal height (see the penultimate paragraph of
# http://doc.qt.io/qt-4.8/qabstractscrollarea.html#addScrollBarWidget)
view.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Ignored)
gui.separator(view.box, 6, 6)
self.group_vars = VariableListModel(placeholder="None")
self.group_view = view = gui.listView(
self.controlArea, self, "group_var", box="Subgroups",
model=self.group_vars, callback=self.grouping_changed)
gui.separator(self.group_view.box, 6, 6)
self.cb_order = gui.checkBox(
view.box, self, "order_by_importance",
"Order by relevance",
tooltip="Order by 𝜒² or ANOVA over the subgroups",
callback=self.apply_sorting)
self.group_vars = DomainModel(
placeholder="None", separators=False,
valid_types=Orange.data.DiscreteVariable)
self.group_view = view = gui.listView(
self.controlArea, self, "group_var", box="Subgroups",
model=self.group_vars, callback=self.grouping_changed)
view.setEnabled(False)
view.setMinimumSize(QSize(30, 30))
# See the comment above
Expand Down Expand Up @@ -289,11 +287,11 @@ def eventFilter(self, obj, event):

return super().eventFilter(obj, event)

def reset_attrs(self, domain):
self.attrs[:] = [
def reset_groups(self, domain):
self.group_vars[:] = [
var for var in chain(
domain.class_vars, domain.metas, domain.attributes)
if var.is_primitive()]
if var.is_discrete]

# noinspection PyTypeChecker
@Inputs.data
Expand All @@ -309,9 +307,9 @@ def set_data(self, dataset):
self.attribute = None
if dataset:
domain = dataset.domain
self.group_vars.set_domain(domain)
self.attrs.set_domain(domain)
self.reset_groups(domain)
self.group_view.setEnabled(len(self.group_vars) > 1)
self.reset_attrs(domain)
self.select_default_variables(domain)
self.openContext(self.dataset)
self.grouping_changed()
Expand All @@ -332,37 +330,34 @@ def select_default_variables(self, domain):
self.group_var = None # Reset to trigger selection via callback

def apply_sorting(self):
def compute_score(attr):
if attr is group_var:
def compute_anova(group):
group_col = data.get_column_view(group)[0].astype(float)
groups = (attr_col[group_col == i]
for i in range(len(group.values)))
groups = (col[~np.isnan(col)] for col in groups)
groups = [group for group in groups if len(group)]
p = f_oneway(*groups)[1] if len(groups) > 1 else 2
return 2 if math.isnan(p) else p

def compute_chi(group):
if group is attr:
return 3
if attr.is_continuous:
# One-way ANOVA
col = data.get_column_view(attr)[0].astype(float)
groups = (col[group_col == i] for i in range(n_groups))
groups = (col[~np.isnan(col)] for col in groups)
groups = [group for group in groups if len(group)]
p = f_oneway(*groups)[1] if len(groups) > 1 else 2
else:
p = self._chi_square(group_var, attr)[1]
if math.isnan(p):
return 2
return p
p = self._chi_square(group, attr)[1]
return 2 if math.isnan(p) else p

data = self.dataset
if data is None:
return
domain = data.domain
attribute = self.attribute
group_var = self.group_var
if self.order_by_importance and group_var is not None:
n_groups = len(group_var.values)
group_col = data.get_column_view(group_var)[0] if \
domain.has_continuous_attributes(
include_class=True, include_metas=True) else None
self.attrs.sort(key=compute_score)
attr = self.attribute
if self.order_by_importance:
if attr.is_continuous:
attr_col = data.get_column_view(attr)[0]
self.group_vars.sort(key=compute_anova)
else:
self.group_vars.sort(key=compute_chi)
else:
self.reset_attrs(domain)
self.attribute = attribute
self.reset_groups(domain)

def _chi_square(self, group_var, attr):
# Chi-square with the given distribution into groups
Expand All @@ -379,15 +374,14 @@ def _chi_square(self, group_var, attr):
def reset_all_data(self):
self.clear_scene()
self.stat_test = ""
self.attrs.clear()
self.group_vars.set_domain(None)
self.attrs.set_domain(None)
self.group_vars.clear()
self.group_view.setEnabled(False)
self.is_continuous = False
self.update_display_box()

def grouping_changed(self):
self.cb_order.setEnabled(self.group_var is not None)
self.apply_sorting()
self.attr_changed()

def select_box_items(self):
Expand All @@ -399,6 +393,7 @@ def select_box_items(self):

def attr_changed(self):
self.compute_box_data()
self.apply_sorting()
self.update_display_box()
self.layout_changed()

Expand Down

0 comments on commit 3241ee5

Please sign in to comment.