def annotate(self, ax, **kwargs): """ Draws the annotation box for the given axis *ax*. Additional kwargs are passed on to ``annotate``. """ for key in self.default_annotation_kwargs: if key not in kwargs: kwargs[key] = self.default_annotation_kwargs[key] # Make text alignment match the specified offsets (this allows easier # changing of relative position of text box...) dx, dy = kwargs['xytext'] horizontal = 'left' if dx > 0 else 'right' vertical = 'bottom' if dy > 0 else 'top' kwargs['ha'], kwargs['va'] = horizontal, vertical annotation = ax.annotate('This text will be reset', **kwargs) # Place the annotation in the figure instead of the axes so that it # doesn't get hidden behind other subplots (zorder won't fix that). ax.figure.texts.append(ax.texts.pop()) # Create a draggable annotation box, if required. if self.draggable: offsetbox.DraggableAnnotation(annotation) return annotation
def annotate(self, ax, **kwargs): """ Draws the annotation box for the given axis *ax*. Additional kwargs are passed on to ``annotate``. """ def update_from_defaults(key, kwargs): if kwargs.get(key, None) is not None: new = copy.deepcopy(self.default_annotation_kwargs[key]) new.update(kwargs[key]) kwargs[key] = new return kwargs user_set_ha = 'ha' in kwargs or 'horizontalalignment' in kwargs user_set_va = 'va' in kwargs or 'verticalalignment' in kwargs # Ensure bbox and arrowstyle params passed in use the defaults for # DataCursor. This allows things like ``bbox=dict(alpha=1)`` to show a # yellow, rounded box, instead of the mpl default blue, square box.) kwargs = update_from_defaults('bbox', kwargs) kwargs = update_from_defaults('arrowstyle', kwargs) # Set defaults where approriate. for key in self.default_annotation_kwargs: if key not in kwargs: kwargs[key] = self.default_annotation_kwargs[key] # Make text alignment match the specified offsets (this allows easier # changing of relative position of text box...) dx, dy = kwargs['xytext'] horizontal = {1: 'left', 0: 'center', -1: 'right'}[np.sign(dx)] vertical = {1: 'bottom', 0: 'center', -1: 'top'}[np.sign(dy)] if not user_set_ha: kwargs['ha'] = horizontal if not user_set_va: kwargs['va'] = vertical annotation = ax.annotate('This text will be reset', **kwargs) # Place the annotation in the figure instead of the axes so that it # doesn't get hidden behind other subplots (zorder won't fix that). ax.figure.texts.append(ax.texts.pop()) # Create a draggable annotation box, if required. if self.draggable: offsetbox.DraggableAnnotation(annotation) return annotation
def off(self, stop_blocking=True): """ Turns off the DataCursor and optionally stops it from blocking Parameters ---------- stop_blocking : bool; optional If True, have the data cursor stop blocking so Python can continue with whats next. Otherwise, if `stop_blocking` is False, Python will wait; this is probably only useful when the data cursor is controlled in a GUI environment. Notes ----- Note that the keystroke 't' will also turn off the DataCursor; in that case, `stop_blocking` is True. """ self._init_all() if self._is_on: for ax in self._ax: if ax in self._annotation: self._annotation[ax].set_visible(False) self._dot[ax].set_visible(False) for fig in self._figs: if fig in self._kid: fig.canvas.mpl_disconnect(self._kid[fig]) if self.hover and fig in self._mid and self._mid[ fig] is not None: fig.canvas.mpl_disconnect(self._mid[fig]) if fig in self._bid: fig.canvas.mpl_disconnect(self._bid[fig]) fig.canvas.mpl_disconnect(self._aid[fig]) for an in self.notes: ax = an.axes if an in ax.texts: # give annotation to figure so it's on top ax.figure.texts.append(an) ax.texts.pop(ax.texts.index(an)) # and make it draggable offsetbox.DraggableAnnotation(an) self._is_on = False for fig in self._figs: fig.canvas.draw() if self._in_loop and stop_blocking: self._figs[0].canvas.stop_event_loop() self._in_loop = False
def annotate(self, ax, **kwargs): """ Draws the annotation box for the given axis *ax*. Additional kwargs are passed on to ``annotate``. """ def update_from_defaults(key, kwargs): if kwargs.get(key, None) is not None: new = copy.deepcopy(self.default_annotation_kwargs[key]) new.update(kwargs[key]) kwargs[key] = new return kwargs # Ensure bbox and arrowstyle params passed in use the defaults for # DataCursor. This allows things like ``bbox=dict(alpha=1)`` to show a # yellow, rounded box, instead of the mpl default blue, square box.) kwargs = update_from_defaults('bbox', kwargs) kwargs = update_from_defaults('arrowstyle', kwargs) # Set defaults where approriate. for key in self.default_annotation_kwargs: if key not in kwargs: kwargs[key] = self.default_annotation_kwargs[key] annotation = ax.annotate('This text will be reset', **kwargs) # Place the annotation in the figure instead of the axes so that it # doesn't get hidden behind other subplots (zorder won't fix that). ax.figure.texts.append(ax.texts.pop()) # Create a draggable annotation box, if required. if self.draggable: offsetbox.DraggableAnnotation(annotation) # Save whether or not alignment is user-specified. If not, adjust to # match text offset (and update when display moves out of figure). self._user_set_ha = 'ha' in kwargs or 'horizontalalignment' in kwargs self._user_set_va = 'va' in kwargs or 'verticalalignment' in kwargs self._adjust_alignment(annotation) return annotation