Inspired by this example I'm trying to write a little matplotlib program that allows the user to drag and drop datapoints in a scatter plot dynamically. In contrast to the example which uses a bar plot (and thus allows dragging of rectangles) my goal was to achieve the same with other patches, like for instance a circle (any patch that is more scatter-plot-compatible than a rectangle would do). However I'm stuck at the point of updating the position of my patch. While a Rectangle provides a function set_xy I cannot find a direct analog for Cirlce or Ellipse. Obtaining the position of a circle is also less straightforward that for a rectangle, but is possible via obtaining the bounding box. The missing piece now is to find a way to update the position of my patch. Any hint on how to achieve this would be great! The current minimal working example would look like this:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches

class DraggablePatch:

  def __init__(self, patch):
    self.patch = patch
    self.storedPosition = None
    self.connect()

  def getPosOfPatch(self, marker):
    ext = marker.get_extents().get_points()
    x0 = ext[0,0]
    y0 = ext[0,1]
    x1 = ext[1,0]
    y1 = ext[1,1]
    return 0.5*(x0+x1), 0.5*(y0+y1)

  def connect(self):
    'connect to all the events we need'
    self.cidpress  = self.patch.figure.canvas.mpl_connect('button_press_event',  self.onPress)
    self.cidmotion = self.patch.figure.canvas.mpl_connect('motion_notify_event', self.onMove)

  def onPress(self, event):
    'on button press we will see if the mouse is over us and store some data'
    contains, attrd = self.patch.contains(event)
    if contains:
      self.storedPosition = self.getPosOfPatch(self.patch), event.xdata, event.ydata

  def onMove(self, event):
  
Edit
Report