matplotlib - 以交互方式选择点或位置?

hat*_*rix 19 matplotlib

在R中,有一个locator类似Matlab的函数,ginput你可以用鼠标点击图形并选择任何x,y坐标.此外,还有一个函数叫做identify(x,y),如果给它一组你已经绘制的点x,y,然后点击图形,它将返回最接近的x,y点的索引(在可调公差范围内) )到您选择的位置(或多个索引,如果选择了多个点).Matplotlib中是否有这样的功能?

cyb*_*org 15

您可能想要使用选择事件:

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)
Run Code Online (Sandbox Code Playgroud)

由拾取器参数设置的容差:

line, = ax1.plot(rand(100), 'o', picker=5)  # 5 points tolerance
Run Code Online (Sandbox Code Playgroud)


med*_*igo 7

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)
Run Code Online (Sandbox Code Playgroud)

  • 如果你将来导入打印功能,你必须添加brakes:print('X ='+ str(np.take(xdata,ind)[0])) (4认同)

fzy*_*cjy 7

哇很多年过去了!现在matplotlib也支持ginput与Matlab几乎相同的API功能。因此不再需要通过 mpl-connect 等进行破解!(https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.ginput.html)例如,

plt.ginput(4)
Run Code Online (Sandbox Code Playgroud)

将让用户选择 4 个点。