1010from AnyQt .QtGui import QStandardItem , QColor , QFontMetrics , QCursor
1111from AnyQt .QtCore import Qt , QEvent , QSize , QRectF , QPoint
1212from 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
1516import pyqtgraph as pg
1617from pyqtgraph .graphicsItems .ScatterPlotItem import ScatterPlotItem
3940
4041class 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
368369RANGE = QRectF (- 1.2 , - 1.05 , 2.4 , 2.1 )
369- MAX_ANCHORS = 16
370370MAX_POINTS = 100
371371
372372class 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