Подтвердить что ты не робот

Matplotlib - интерактивно выбирать точки или местоположения?

В R есть функция locator, которая похожа на Matlab ginput, где вы можете щелкнуть мышью по фигуре и выбрать любую координату x, y. Кроме того, существует функция с именем identify(x,y), где, если вы даете ей набор точек x, y, которые вы нарисовали, а затем щелкните по фигуре, он вернет индекс точки x, y, ближайший (в пределах настраиваемый допуск) к выбранному вами местоположению (или нескольким индексам, если выбрано несколько точек). Есть ли такая функциональность в Matplotlib?

4b9b3361

Ответ 1

Вы можете использовать событие выбора:

fig = figure()
ax1 = fig.add_subplot(111)
ax1.set_title('custom picker for line data')
line, = ax1.plot(rand(100), rand(100), 'o', picker=line_picker)
fig.canvas.mpl_connect('pick_event', onpick2)

Толерантность, установленная параметром picker:

line, = ax1.plot(rand(100), 'o', picker=5)  # 5 points tolerance

Ответ 2

from __future__ import print_function
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
from matplotlib.patches import Rectangle
from matplotlib.text import Text
from matplotlib.image import AxesImage
import numpy as np
from numpy.random import rand

if 1:
    fig, ax = plt.subplots()
    ax.set_title('click on points', picker=True)
    ax.set_ylabel('ylabel', picker=True, bbox=dict(facecolor='red'))
    line, = ax.plot(rand(100), 'o', picker=5)

    def onpick1(event):
        if isinstance(event.artist, Line2D):
            thisline = event.artist
            xdata = thisline.get_xdata()
            ydata = thisline.get_ydata()
            ind = event.ind
            print 'X='+str(np.take(xdata, ind)[0]) # Print X point
            print 'Y='+str(np.take(ydata, ind)[0]) # Print Y point

    fig.canvas.mpl_connect('pick_event', onpick1)

Ответ 3

Вау, много лет прошло! Теперь matplotlib также поддерживает функцию ginput, которая имеет почти тот же API, что и Matlab. Так что больше нет необходимости взламывать mpl-connect и так далее! (https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.ginput.html) Например,

plt.ginput(4)

позволит пользователю выбрать 4 балла.