GUI Python yang menggambar titik saat mengklik plot?

Pertama-tama cobalah membuat plot interaktif, jadi bantuan apa pun diterima.

Saya mencoba mendapatkan plot matplotlib interaktif di mana titik-titik diplot setiap kali mouse diklik. Titik-titik tersebut akan diplot pada lokasi klik dan di atas gambar. Saya rasa saya sudah mengetahui cara melakukan itu, tetapi saya ingin tahu apakah ada cara mudah untuk menambahkan tombol "batalkan" sehingga saya dapat menghapus titik terakhir yang diplot jika diperlukan. Sejalan dengan ide yang sama, saya juga ingin menambahkan tombol "reset" (yaitu menghapus semua titik) dan "simpan".

from matplotlib import pyplot as plt

def onclick(event):
    button=event.button
    x=event.xdata
    y=event.ydata

    if button==1: plt.plot(x,y,'ro')
    if button!=1: plt.plot(x,y,'bo')
    print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(
    event.button, event.x, event.y, event.xdata, event.ydata)

im = plt.imread('Picture1.png')
fig, ax=plt.subplots()
ax.imshow(im)
ax.autoscale(False)
cid = fig.canvas.mpl_connect('button_press_event', onclick)

plt.show()

person user2920100    schedule 25.10.2013    source sumber


Jawaban (1)


Anda hanya perlu menulis logika untuk melakukannya. Ini adalah versi yang sedikit dimodifikasi dari sesuatu yang saya gunakan (dan hanya menyimpan satu daftar) tetapi akan mudah untuk memperluasnya untuk melakukan apa yang Anda inginkan.

class clicker_class(object):
    def __init__(self, ax, pix_err=1):
        self.canvas = ax.get_figure().canvas
        self.cid = None
        self.pt_lst = []
        self.pt_plot = ax.plot([], [], marker='o',
                               linestyle='none', zorder=5)[0]
        self.pix_err = pix_err
        self.connect_sf()

    def set_visible(self, visible):
        '''sets if the curves are visible '''
        self.pt_plot.set_visible(visible)

    def clear(self):
        '''Clears the points'''
        self.pt_lst = []
        self.redraw()

    def connect_sf(self):
        if self.cid is None:
            self.cid = self.canvas.mpl_connect('button_press_event',
                                               self.click_event)

    def disconnect_sf(self):
        if self.cid is not None:
            self.canvas.mpl_disconnect(self.cid)
            self.cid = None

    def click_event(self, event):
        ''' Extracts locations from the user'''
        if event.key == 'shift':
            self.pt_lst = []
            return
        if event.xdata is None or event.ydata is None:
            return
        if event.button == 1:
            self.pt_lst.append((event.xdata, event.ydata))
        elif event.button == 3:
            self.remove_pt((event.xdata, event.ydata))

        self.redraw()

    def remove_pt(self, loc):
        if len(self.pt_lst) > 0:
            self.pt_lst.pop(np.argmin(map(lambda x:
                                          np.sqrt((x[0] - loc[0]) ** 2 +
                                                  (x[1] - loc[1]) ** 2),
                                          self.pt_lst)))

    def redraw(self):
        if len(self.pt_lst) > 0:
            x, y = zip(*self.pt_lst)
        else:
            x, y = [], []
        self.pt_plot.set_xdata(x)
        self.pt_plot.set_ydata(y)

        self.canvas.draw()

    def return_points(self):
        '''Returns the clicked points in the format the rest of the
        code expects'''
        return np.vstack(self.pt_lst).T

ax = gca()
cc = clicker_class(ax)
person tacaswell    schedule 25.10.2013