[PYTHON] Matplotlib : 선택 영역을 마우스로 직사각형 모양으로 그립니다.
PYTHONMatplotlib : 선택 영역을 마우스로 직사각형 모양으로 그립니다.
마우스 이벤트로 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.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.다음은 마우스를 사용하여 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()
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
'PYTHON' 카테고리의 다른 글
[PYTHON] TFRecordReader가 매우 느리게 보이고 멀티 스레드 읽기가 작동하지 않습니다. (0) | 2018.11.03 |
---|---|
[PYTHON] Python에서 Openpyxl을 사용하여 기존 Excel 파일 수정 (0) | 2018.11.03 |
[PYTHON] 어떻게 파이썬에서 @debuggable 데코레이터를 작성하겠습니까? (0) | 2018.11.03 |
[PYTHON] Windows에서 활성 Chrome 탭의 URL을 얻으려면 어떻게해야합니까? (0) | 2018.11.03 |
[PYTHON] 1 & 1 공유 호스팅에 플라스크 애플리케이션 배포 (CGI 사용) (0) | 2018.11.03 |