@@ -373,6 +373,7 @@ def __init__(self):
373373 self .subset_data = None
374374 self .subset_indices = None
375375 self .__pending_selection = self .selection
376+ self .__invalidated = True
376377 self .setup_gui ()
377378
378379 # GUI
@@ -395,19 +396,35 @@ def _add_controls(self):
395396 gui .auto_commit (self .controlArea , self , "auto_commit" ,
396397 "Send Selection" , "Send Automatically" )
397398
399+ @property
400+ def effective_variables (self ):
401+ return self .data .domain .attributes
402+
403+ @property
404+ def effective_data (self ):
405+ return self .data .transform (Domain (self .effective_variables ,
406+ self .data .domain .class_vars ,
407+ self .data .domain .metas ))
408+
398409 # Input
399410 @Inputs .data
400411 @check_sql_input
401412 def set_data (self , data ):
402- same_domain = (self .data and data and
413+ data_exists = self .data is not None
414+ effective_data = self .effective_data if data_exists else None
415+ same_domain = (data_exists and data and
403416 data .domain .checksum () == self .data .domain .checksum ())
404417 self .closeContext ()
405- self .clear ()
406418 self .data = data
407419 self .check_data ()
408420 if not same_domain :
409421 self .init_attr_values ()
410422 self .openContext (self .data )
423+ self .__invalidated = not (data_exists and self .data and
424+ np .array_equal (effective_data .X ,
425+ self .effective_data .X ))
426+ if self .__invalidated :
427+ self .clear ()
411428 self .cb_class_density .setEnabled (self .can_draw_density ())
412429
413430 def check_data (self ):
@@ -422,7 +439,11 @@ def set_subset_data(self, subset):
422439 self .controls .graph .alpha_value .setEnabled (subset is None )
423440
424441 def handleNewSignals (self ):
425- self .setup_plot ()
442+ if self .__invalidated :
443+ self .__invalidated = False
444+ self .setup_plot ()
445+ else :
446+ self .graph .update_point_props ()
426447 self .commit ()
427448
428449 def get_subset_mask (self ):
@@ -439,7 +460,7 @@ def get_embedding(self):
439460 should return embedding for all data (valid and invalid). Invalid
440461 data embedding coordinates should be set to 0 (in some cases to Nan).
441462
442- The method should also sets self.valid_data.
463+ The method should also set self.valid_data.
443464
444465 Returns:
445466 np.array: Array of embedding coordinates with shape
@@ -552,8 +573,6 @@ def sizeHint(self):
552573 return QSize (1132 , 708 )
553574
554575 def clear (self ):
555- self .data = None
556- self .valid_data = None
557576 self .selection = None
558577 self .graph .selection = None
559578
@@ -587,16 +606,6 @@ def __init__(self):
587606 self .graph .view_box .moved .connect (self ._manual_move )
588607 self .graph .view_box .finished .connect (self ._manual_move_finish )
589608
590- @property
591- def effective_variables (self ):
592- return self .data .domain .attributes
593-
594- @property
595- def effective_data (self ):
596- return self .data .transform (Domain (self .effective_variables ,
597- self .data .domain .class_vars ,
598- self .data .domain .metas ))
599-
600609 def check_data (self ):
601610 def error (err ):
602611 err ()
@@ -615,7 +624,7 @@ def error(err):
615624
616625 def init_projection (self ):
617626 self .projection = None
618- if not len ( self .effective_variables ) :
627+ if not self .effective_variables :
619628 return
620629 try :
621630 self .projection = self .projector (self .effective_data )
0 commit comments