Skip to content

Commit a6f06ee

Browse files
committed
OWBoxPlot: Plot missing values
1 parent 5febf5f commit a6f06ee

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

Orange/statistics/contingency.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ def __getitem__(self, index):
125125
if isinstance(index[1], str):
126126
index = (index[0], self.col_variable.to_val(index[1]))
127127
result = super().__getitem__(index)
128+
if isinstance(index, int) or len(index) == 1:
129+
result.unknowns = self.unknowns[index]
128130
if result.strides:
129131
result.col_variable = self.col_variable
130132
result.row_variable = self.row_variable

Orange/statistics/distribution.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,11 @@ def max(self):
211211
if self.variable.ordered:
212212
return self.variable.values[-1]
213213

214+
def sum(self, *args, **kwargs):
215+
res = super().sum(*args, **kwargs)
216+
res.unknowns = self.unknowns
217+
return res
218+
214219

215220
class Continuous(Distribution):
216221
def __new__(cls, dat, variable=None, unknowns=None):

Orange/widgets/visualize/owboxplot.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import Orange.data
1717
from Orange.data.filter import FilterDiscrete, FilterContinuous, Values
1818
from Orange.statistics import contingency, distribution
19+
from Orange.statistics.contingency import Discrete
1920

2021
from Orange.widgets import widget, gui
2122
from Orange.widgets.settings import (Setting, DomainContextHandler,
@@ -434,7 +435,9 @@ def compute_box_data(self):
434435
self.label_txts_all = label_texts
435436
else:
436437
self.label_txts_all = \
437-
[v for v, c in zip(self.group_var.values, self.conts)
438+
[v for v, c in zip(
439+
self.group_var.values + ["Missing values"],
440+
self.conts.array_with_unknowns)
438441
if np.sum(c) > 0]
439442
else:
440443
self.dist = distribution.get_distribution(dataset, attr)
@@ -560,7 +563,8 @@ def _display_changed_disc(self):
560563
if self.group_var:
561564
self.labels = [
562565
QGraphicsTextItem("{}".format(int(sum(cont))))
563-
for cont in self.conts if np.sum(cont) > 0]
566+
for cont in self.conts.array_with_unknowns
567+
if np.sum(cont) > 0]
564568
else:
565569
self.labels = [
566570
QGraphicsTextItem(str(int(sum(self.dist))))]
@@ -570,15 +574,18 @@ def _display_changed_disc(self):
570574
self.draw_axis_disc()
571575
if self.group_var:
572576
self.boxes = \
573-
[self.strudel(cont, i) for i, cont in enumerate(self.conts)
577+
[self.strudel(cont, i)
578+
for i, cont in enumerate(self.conts.array_with_unknowns)
574579
if np.sum(cont) > 0]
575580
self.conts = self.conts[np.sum(np.array(self.conts), axis=1) > 0]
576581

577582
if self.sort_freqs:
578583
# pylint: disable=invalid-unary-operand-type
579-
self.order = sorted(self.order, key=(-np.sum(self.conts, axis=1)).__getitem__)
584+
self.order = sorted(
585+
self.order, key=(-np.sum(
586+
self.conts.array_with_unknowns, axis=1)).__getitem__)
580587
else:
581-
self.boxes = [self.strudel(self.dist)]
588+
self.boxes = [self.strudel(self.dist, self.dist.unknowns)]
582589

583590
for row, box_index in enumerate(self.order):
584591
y = (-len(self.boxes) + row) * 40 + 10
@@ -626,7 +633,7 @@ def __draw_row_counts(self, y, row):
626633
label = self.labels[row]
627634
b = label.boundingRect()
628635
if self.group_var:
629-
right = self.scale_x * sum(self.conts[row])
636+
right = self.scale_x * sum(self.conts.array_with_unknowns[row])
630637
else:
631638
right = self.scale_x * sum(self.dist)
632639
label.setPos(right + 10, y - b.height() / 2)
@@ -995,6 +1002,8 @@ def strudel(self, dist, group_val_index=None):
9951002
cond.append(FilterDiscrete(self.group_var, [group_val_index]))
9961003
box.append(FilterGraphicsRectItem(cond, 0, -10, 1, 10))
9971004
cum = 0
1005+
values = attr.values + ["Missing values"]
1006+
colors = np.vstack((attr.colors, [128, 128, 128]))
9981007
for i, v in enumerate(dist):
9991008
if v < 1e-6:
10001009
continue
@@ -1005,15 +1014,16 @@ def strudel(self, dist, group_val_index=None):
10051014
if group_val_index is not None:
10061015
cond.append(FilterDiscrete(self.group_var, [group_val_index]))
10071016
rect = FilterGraphicsRectItem(cond, cum + 1, -6, v - 2, 12)
1008-
rect.setBrush(QBrush(QColor(*attr.colors[i])))
1017+
rect.setBrush(QBrush(QColor(*colors[i])))
10091018
rect.setPen(QPen(Qt.NoPen))
10101019
if self.stretched:
1011-
tooltip = "{}: {:.2f}%".format(attr.values[i],
1012-
100 * dist[i] / sum(dist))
1020+
tooltip = "{}: {:.2f}%".format(
1021+
values[i],
1022+
100 * dist[i] / sum(dist))
10131023
else:
1014-
tooltip = "{}: {}".format(attr.values[i], int(dist[i]))
1024+
tooltip = "{}: {}".format(values[i], int(dist[i]))
10151025
rect.setToolTip(tooltip)
1016-
text = QGraphicsTextItem(attr.values[i])
1026+
text = QGraphicsTextItem(values[i])
10171027
box.append(rect)
10181028
box.append(text)
10191029
cum += v

0 commit comments

Comments
 (0)