Skip to content

Commit b2de1a5

Browse files
committed
Radviz: various fixes:
* circle * message * density * VizRank: maximum number of features * classes not as default as selected * use first 5 features * do not use plotdata.circle * VizRank: fix combinations
1 parent 3210b3f commit b2de1a5

File tree

1 file changed

+26
-34
lines changed

1 file changed

+26
-34
lines changed

Orange/widgets/visualize/owradviz.py

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
from AnyQt.QtGui import QStandardItem, QColor, QFontMetrics, QCursor
1111
from AnyQt.QtCore import Qt, QEvent, QSize, QRectF, QPoint
1212
from AnyQt.QtCore import pyqtSignal as Signal
13-
from AnyQt.QtWidgets import qApp, QSizePolicy, QApplication, QToolTip, QGraphicsSceneMouseEvent
13+
from AnyQt.QtWidgets import qApp, QSizePolicy, QApplication, QToolTip, QGraphicsSceneMouseEvent, \
14+
QGraphicsEllipseItem
1415

1516
import pyqtgraph as pg
1617
from pyqtgraph.graphicsItems.ScatterPlotItem import ScatterPlotItem
@@ -39,7 +40,7 @@
3940

4041
class RadvizVizRank(VizRankDialog, OWComponent):
4142
captionTitle = "Score Plots"
42-
n_attrs = settings.Setting(6)
43+
n_attrs = settings.Setting(3)
4344
minK = 10
4445

4546
attrsSelected = Signal([])
@@ -58,15 +59,12 @@ def __init__(self, master):
5859

5960
box = gui.hBox(self)
6061
self.n_attrs_spin = gui.spin(
61-
box, self, "n_attrs", 4, max_n_attrs, label="Number of variables: ",
62+
box, self, "n_attrs", 3, max_n_attrs, label="Maximum number of variables: ",
6263
controlWidth=50, alignment=Qt.AlignRight, callback=self._n_attrs_changed)
6364
gui.rubber(box)
6465
self.last_run_n_attrs = None
6566
self.attr_color = master.graph.attr_color
66-
6767
self.attr_ordering = None
68-
self.last_run_n_attrs = None
69-
self.attr_color = master.graph.attr_color
7068
self.data = None
7169
self.valid_data = None
7270

@@ -146,7 +144,7 @@ def on_selection_changed(self, selected, deselected):
146144
def iterate_states(self, state):
147145
if state is None: # on the first call, compute order
148146
self.attrs = self._compute_attr_order()
149-
state = list(range(self.n_attrs))
147+
state = list(range(3))
150148
else:
151149
state = list(state)
152150

@@ -159,7 +157,10 @@ def combinations(n, s):
159157
break
160158
s[up] = up
161159
if s[-1] == n:
162-
break
160+
if len(s) < self.n_attrs:
161+
s = list(range(len(s) + 1))
162+
else:
163+
break
163164

164165
for c in combinations(len(self.attrs), state):
165166
for p in islice(permutations(c[1:]), factorial(len(c) - 1) // 2):
@@ -283,11 +284,11 @@ def hide_axes(self):
283284
self.plot_widget.hideAxis(axis)
284285

285286
def update_data(self, attr_x, attr_y, reset_view=True):
286-
super().update_data(attr_x, attr_y, reset_view)
287-
self.hide_axes()
288287
if reset_view:
289288
self.view_box.setRange(RANGE, padding=0.025)
290289
self.view_box.setAspectLocked(True, 1)
290+
super().update_data(attr_x, attr_y, reset_view=False)
291+
self.hide_axes()
291292

292293
def show_arc_arrow(self, x=None, y=None, point_i=None):
293294
def remove_arc_arrows():
@@ -366,7 +367,6 @@ def help_event(self, event):
366367

367368

368369
RANGE = QRectF(-1.2, -1.05, 2.4, 2.1)
369-
MAX_ANCHORS = 16
370370
MAX_POINTS = 100
371371

372372
class OWRadviz(widget.OWWidget):
@@ -404,7 +404,7 @@ class Information(widget.OWWidget.Information):
404404
sql_sampled_data = widget.Msg("Data has been sampled")
405405

406406
class Warning(widget.OWWidget.Warning):
407-
no_features = widget.Msg("At least 2 features has to be chosen")
407+
no_features = widget.Msg("At least 2 features have to be chosen")
408408

409409
class Error(widget.OWWidget.Error):
410410
sparse_data = widget.Msg("Sparse data is not supported")
@@ -470,12 +470,9 @@ def __init__(self):
470470

471471
self.graph.zoom_actions(self)
472472

473-
self._circle = pg.PlotCurveItem(
474-
x=np.fromfunction(lambda i: np.cos(2. * np.pi * i / 120.), (121,), dtype=int),
475-
y=np.fromfunction(lambda i: np.sin(2. * np.pi * i / 120.), (121,), dtype=int),
476-
pen=pg.mkPen(QColor(0, 0, 0), width=2),
477-
antialias=False
478-
)
473+
self._circle = QGraphicsEllipseItem()
474+
self._circle.setRect(QRectF(-1., -1., 2., 2.))
475+
self._circle.setPen(pg.mkPen(QColor(0, 0, 0), width=2))
479476

480477
def resizeEvent(self, event):
481478
self._update_points_labels()
@@ -500,7 +497,6 @@ def _new_plotdata(self):
500497
valid_mask=None,
501498
embedding_coords=None,
502499
points=None,
503-
circle=None,
504500
arcarrows=[],
505501
point_labels=[],
506502
rand=None,
@@ -553,7 +549,7 @@ def _vizrank_color_change(self):
553549
and not np.isnan(self.data.get_column_view(attr_color)[0].astype(float)).all())
554550
if is_enabled and (attr_color is None or
555551
(attr_color is not None and not attr_color.is_discrete)):
556-
self.btn_vizrank.setToolTip("Discrete color variable has to be selected.")
552+
self.btn_vizrank.setToolTip("Categorical color variable has to be selected.")
557553
else:
558554
self.btn_vizrank.setToolTip("")
559555
self.vizrank.initialize()
@@ -638,10 +634,10 @@ def are_instances(data):
638634
self.data = data
639635
self.init_attr_values()
640636
domain = data.domain
641-
vars = [v for v in chain(domain.class_vars, domain.metas, domain.attributes)
642-
if v.is_primitive]
643-
self.model_selected[:] = vars[:6]
644-
self.model_other[:] = vars[6:]
637+
vars = [v for v in chain(domain.metas, domain.attributes)
638+
if v.is_primitive()]
639+
self.model_selected[:] = vars[:5]
640+
self.model_other[:] = vars[5:] + list(domain.class_vars)
645641
self.model_selected[:], self.model_other[:] = settings(data)
646642
self._selection = np.zeros(len(data), dtype=np.uint8)
647643
self.invalidate_plot()
@@ -696,7 +692,7 @@ def prepare_radviz_data(self, variables):
696692
self.plotdata.points = points
697693
self.plotdata.valid_mask = valid_mask
698694

699-
def setup_plot(self, reset_view=False):
695+
def setup_plot(self, reset_view=True):
700696
if self.data is None:
701697
return
702698
self.graph.jitter_continuous = True
@@ -714,10 +710,6 @@ def setup_plot(self, reset_view=False):
714710
if self.plotdata.embedding_coords is None:
715711
return
716712

717-
self.plotdata.circle = self._circle
718-
if reset_view:
719-
self.viewbox.setRange(RANGE)
720-
self.viewbox.setAspectLocked(True, 1)
721713
domain = self.data.domain
722714
new_metas = domain.metas + (self.variable_x, self.variable_y)
723715
domain = Domain(attributes=domain.attributes,
@@ -735,7 +727,7 @@ def setup_plot(self, reset_view=False):
735727
if self._selection is not None:
736728
self.graph.selection = self._selection[self.plotdata.valid_mask]
737729
self.graph.update_data(self.variable_x, self.variable_y, reset_view=reset_view)
738-
self.graph.plot_widget.addItem(self.plotdata.circle)
730+
self.graph.plot_widget.addItem(self._circle)
739731
self.graph.scatterplot_points = ScatterPlotItem(
740732
x=self.plotdata.points[:, 0],
741733
y=self.plotdata.points[:, 1]
@@ -780,8 +772,8 @@ def manual_move(self):
780772
data = Table.from_numpy(domain, X=np.hstack((ec, data_x)), Y=data_y, metas=data_metas)
781773
self.graph.new_data(data, None)
782774
self.graph.selection = selection
783-
self.graph.update_data(self.variable_x, self.variable_y, reset_view=False)
784-
self.graph.plot_widget.addItem(self.plotdata.circle)
775+
self.graph.update_data(self.variable_x, self.variable_y, reset_view=True)
776+
self.graph.plot_widget.addItem(self._circle)
785777
self.graph.scatterplot_points = ScatterPlotItem(
786778
x=self.plotdata.points[:, 0], y=self.plotdata.points[:, 1])
787779
self._update_points_labels()
@@ -823,10 +815,10 @@ def _update_graph(self, reset_view=True, **_):
823815
self.graph.zoomStack = []
824816
if self.graph.data is None:
825817
return
826-
self.graph.update_data(self.variable_x, self.variable_y, reset_view)
818+
self.graph.update_data(self.variable_x, self.variable_y, reset_view=reset_view)
827819

828820
def update_density(self):
829-
self._update_graph(reset_view=False)
821+
self._update_graph(reset_view=True)
830822

831823
def selection_changed(self):
832824
if self.graph.selection is not None:

0 commit comments

Comments
 (0)