Matplotlib 플롯의 GUI에서 상자 영역 선택으로 요소 수를 계산하고 요소를 CSV 형식으로 클립 보드에 복사

하고 싶은 일



Matplotlib 플롯에서 GUI로 사각형 영역을 선택하고 선택한 영역 내에서 플롯 된 요소 수를 출력하고 싶습니다!
또한 요소를 CSV 형식으로 클립 보드에 복사하고 싶습니다.

소스 코드


# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from matplotlib.widgets import RectangleSelector
import pyperclip

class RectSelect(object):
    def __init__(self, x, y, ax=None):
        self.ax = ax or plt.gca()
        self.x = x
        self.y = y
        self.rect = Rectangle((0,0), 0, 0, color='orange', alpha=0.5)
        self.ax.add_patch(self.rect)
        self.blc = np.zeros(2)
        self.trc = np.zeros(2)

        def selector(event):
            if event.key in ['Q', 'q'] and selector.RS.active:
                selector.RS.set_active(False)
            if event.key in ['A', 'a'] and not selector.RS.active:
                selector.RS.set_active(True)

        selector.RS = RectangleSelector(self.ax, self.callback)
        self.ax.figure.canvas.mpl_connect('key_press_event', selector)
        self.ax.figure.canvas.mpl_connect('button_release_event', self.release)

    def callback(self, eclick, erelease):
        def _check(a, b):
            if (a >= eclick.xdata and a <= erelease.xdata) and (b >= eclick.ydata and b <= erelease.ydata):
                return True
            else:
                return False

        count = 0
        copy_text = ""
        for x_i, y_j in zip(self.x, self.y):
            if _check(x_i, y_j):
                count += 1
                copy_text += "{0},{1}\r\n".format(x_i, y_j)

        pyperclip.copy(copy_text)
        print count, "num"

    def release(self, event):
        self.rect.set_width(self.trc[0] - self.blc[0])
        self.rect.set_height(self.trc[1] - self.blc[1])
        self.rect.set_xy(self.blc)
        self.ax.figure.canvas.draw()


x = np.random.random(20) * 10
y = np.random.random(20) * 10
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, '.')
region = RectSelect(x, y)
plt.show()

결과



적절하게 플롯하고 마우스로 영역을 선택합니다.


그러면 이런 느낌으로 출력된다. 예상대로 분홍색 사각형 영역의 점 수를 계산할 수있었습니다 (· ω ·) v


추가
사각형 영역을 선택한 후 선택한 점의 좌표를 CSV 형식으로 클립보드에 복사합니다.

참고 사이트


  • Matplotlib 플롯에서 GUI로 박스 영역 선택
  • Event handling and picking
  • 좋은 웹페이지 즐겨찾기