복붙노트

[PYTHON] Matplotlib : 선택 영역을 마우스로 직사각형 모양으로 그립니다.

PYTHON

Matplotlib : 선택 영역을 마우스로 직사각형 모양으로 그립니다.

마우스 이벤트로 matplotlib 플롯에 선택 영역을 그릴 수 있어야합니다. 파이썬으로 어떻게하는지에 대한 정보를 찾지 못했습니다.

마지막으로 matplotlib basemap으로 만든 맵에서 내 마우스로 관심 영역을 그리고 모퉁이 좌표를 검색 할 수 있기를 원합니다.

누구나 아이디어, 예, 참고 자료가 있습니까?

감사,

그렉

class Annotate(object):
  def __init__(self):
      self.ax = plt.gca()
      self.rect = Rectangle((0,0), 1, 1, facecolor='None', edgecolor='green')
      self.x0 = None
      self.y0 = None
      self.x1 = None
      self.y1 = None
      self.ax.add_patch(self.rect)
      self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press)
      self.ax.figure.canvas.mpl_connect('button_release_event', self.on_release)
      self.ax.figure.canvas.mpl_connect('motion_notify_event', self.on_motion)
  def on_press(self, event):
      print 'press'
      self.x0 = event.xdata
      self.y0 = event.ydata    
      self.x1 = event.xdata
      self.y1 = event.ydata
      self.rect.set_width(self.x1 - self.x0)
      self.rect.set_height(self.y1 - self.y0)
      self.rect.set_xy((self.x0, self.y0))
      self.rect.set_linestyle('dashed')
      self.ax.figure.canvas.draw()
  def on_motion(self,event):
      if self.on_press is True:
          return
      self.x1 = event.xdata
      self.y1 = event.ydata
      self.rect.set_width(self.x1 - self.x0)
      self.rect.set_height(self.y1 - self.y0)
      self.rect.set_xy((self.x0, self.y0))
      self.rect.set_linestyle('dashed')
      self.ax.figure.canvas.draw()
  def on_release(self, event):
      print 'release'
      self.x1 = event.xdata
      self.y1 = event.ydata
      self.rect.set_width(self.x1 - self.x0)
      self.rect.set_height(self.y1 - self.y0)
      self.rect.set_xy((self.x0, self.y0))
      self.rect.set_linestyle('solid')
      self.ax.figure.canvas.draw()
      print self.x0,self.x1,self.y0,self.y1
      return [self.x0,self.x1,self.y0,self.y1]

해결법

  1. ==============================

    1.Matplotlib은 자체 RectangleSelector를 제공합니다. matplotlib 페이지에는 필요에 따라 적용 할 수있는 예제가 있습니다.

    Matplotlib은 자체 RectangleSelector를 제공합니다. matplotlib 페이지에는 필요에 따라 적용 할 수있는 예제가 있습니다.

    단순화 된 버전은 다음과 같습니다.

    import matplotlib.pyplot as plt
    import numpy as np
    from matplotlib.widgets  import RectangleSelector
    
    xdata = np.linspace(0,9*np.pi, num=301)
    ydata = np.sin(xdata)
    
    fig, ax = plt.subplots()
    line, = ax.plot(xdata, ydata)
    
    
    def line_select_callback(eclick, erelease):
        x1, y1 = eclick.xdata, eclick.ydata
        x2, y2 = erelease.xdata, erelease.ydata
    
        rect = plt.Rectangle( (min(x1,x2),min(y1,y2)), np.abs(x1-x2), np.abs(y1-y2) )
        ax.add_patch(rect)
    
    
    rs = RectangleSelector(ax, line_select_callback,
                           drawtype='box', useblit=False, button=[1], 
                           minspanx=5, minspany=5, spancoords='pixels', 
                           interactive=True)
    
    plt.show()
    
  2. ==============================

    2.다음은 마우스를 사용하여 matplotlib 플롯에 직사각형을 그리는 방법을 보여주는 작은 예제입니다.

    다음은 마우스를 사용하여 matplotlib 플롯에 직사각형을 그리는 방법을 보여주는 작은 예제입니다.

    import matplotlib.pyplot as plt
    from matplotlib.patches import Rectangle
    
    class Annotate(object):
        def __init__(self):
            self.ax = plt.gca()
            self.rect = Rectangle((0,0), 1, 1)
            self.x0 = None
            self.y0 = None
            self.x1 = None
            self.y1 = None
            self.ax.add_patch(self.rect)
            self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press)
            self.ax.figure.canvas.mpl_connect('button_release_event', self.on_release)
    
        def on_press(self, event):
            print 'press'
            self.x0 = event.xdata
            self.y0 = event.ydata
    
        def on_release(self, event):
            print 'release'
            self.x1 = event.xdata
            self.y1 = event.ydata
            self.rect.set_width(self.x1 - self.x0)
            self.rect.set_height(self.y1 - self.y0)
            self.rect.set_xy((self.x0, self.y0))
            self.ax.figure.canvas.draw()
    
    a = Annotate()
    plt.show()
    
  3. from https://stackoverflow.com/questions/12052379/matplotlib-draw-a-selection-area-in-the-shape-of-a-rectangle-with-the-mouse by cc-by-sa and MIT license