Сохранять координаты кликов мыши с помощью matplotlib

Я пытаюсь реализовать простое событие щелчка мыши в matplotlib. Я хочу нарисовать фигуру, затем с помощью мыши выберите нижний и верхний пределы для интеграции. Пока я могу распечатать координаты для экрана, но не хранить их для последующего использования в программе. Я также хотел бы выйти из соединения с фигурой после второго щелчка мыши.

Ниже приведен код, который в настоящее время отображает и затем печатает координаты.

Мой вопрос (ы):

Как сохранить координаты из рисунка в список? то есть click = [xpos, ypos]

Можно ли получить два набора координат x, чтобы сделать простое интегрирование по этому разделу линии?

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10,10)
y = x**2

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)

def onclick(event):
    global ix, iy
    ix, iy = event.xdata, event.ydata
    print 'x = %d, y = %d'%(
        ix, iy)

    global coords
    coords = [ix, iy]

    return coords


for i in xrange(0,1):

    cid = fig.canvas.mpl_connect('button_press_event', onclick)


plt.show()

Ответы

Ответ 1

mpl_connect необходимо вызвать только один раз, чтобы связать событие с обработчиком событий. Он начнет прослушивать событие click, пока не отключится. И вы можете использовать

fig.canvas.mpl_disconnect(cid)

чтобы отключить событие.

Что вы хотите сделать, это что-то вроде:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-10,10)
y = x**2

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x,y)

coords = []

def onclick(event):
    global ix, iy
    ix, iy = event.xdata, event.ydata
    print 'x = %d, y = %d'%(
        ix, iy)

    global coords
    coords.append((ix, iy))

    if len(coords) == 2:
        fig.canvas.mpl_disconnect(cid)

    return coords
cid = fig.canvas.mpl_connect('button_press_event', onclick)

Ответ 2

Благодаря otterb для предоставления ответа! Я добавил небольшую функцию, взятую отсюда... Найти ближайшее значение в массиве numpy

Во всем этом коде будет отображаться, дождаться выбора x точек и затем вернуть индексы массива x, необходимые для любой интеграции, суммирования и т.д.

Та,

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import trapz

def find_nearest(array,value):
    idx = (np.abs(array-value)).argmin()
    return array[idx]

# Simple mouse click function to store coordinates
def onclick(event):
    global ix, iy
    ix, iy = event.xdata, event.ydata

    # print 'x = %d, y = %d'%(
    #     ix, iy)

    # assign global variable to access outside of function
    global coords
    coords.append((ix, iy))

    # Disconnect after 2 clicks
    if len(coords) == 2:
        fig.canvas.mpl_disconnect(cid)
        plt.close(1)
    return


x = np.arange(-10,10)
y = x**2

fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x,y)

coords = []

# Call click func
cid = fig.canvas.mpl_connect('button_press_event', onclick)

plt.show(1)


# limits for integration
ch1 = np.where(x == (find_nearest(x, coords[0][0])))
ch2 = np.where(x == (find_nearest(x, coords[1][0])))

# Calculate integral
y_int = trapz(y[ch1[0][0]:ch2[0][0]], x = x[ch1[0][0]:ch2[0][0]])

print ''
print 'Integral between '+str(coords[0][0])+ ' & ' +str(coords[1][0])
print y_int

Ответ 3

У меня есть аналогичная необходимость, но этот код не работает для меня. Я скопировал/вставил его напрямую (Anaconda 2.7), но кажется, что fig.canvas.mpl_connect ('button_press_event', onclick) никогда не ждет ввода, что вызывает ошибку в последующих вызовах ords [n] [m]. Предложения?

> Traceback (most recent call last):
> 
>   File "<ipython-input-5-d074e6221b24>", line 1, in <module>
>     runfile('C:/Users/xxx/Documents/Python/test/untitled0.py', wdir='C:/Users/xxx/Documents/Python/test')
> 
>   File
> "C:\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py",
> line 705, in runfile
>     execfile(filename, namespace)
> 
>   File
> "C:\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py",
> line 87, in execfile
>     exec(compile(scripttext, filename, 'exec'), glob, loc)
> 
>   File "C:/Users/xxx/Documents/Python/test/untitled0.py", line
> 45, in <module>
>     ch1 = np.where(x == (find_nearest(x, coords[0][0])))
> 
> IndexError: list index out of range