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

22
在R语言中,有一个名为locator的函数,类似于Matlab的ginput函数,您可以使用鼠标点击图像并选择任何x,y坐标。此外,还有一个名为identify(x,y)的函数,如果您给定了一组已绘制的点x,y,然后在图像上单击,它将返回最接近(在可调节的容差内)您所选择位置的x,y点的索引(如果选择了多个点,则返回多个索引)。Matplotlib中是否有这样的功能?

1
顺便提一下:在R的iplots包中也有iselect()函数。这是一个泛化的函数:它涉及到链接和刷选。在Matlab中,可以通过get(,'BrushData')函数实现相同的功能。 - Iterator
没错,还有Rggobi。但我不知道Matlab有这个功能——我上次密集使用它是在6.5版本时代。看起来自那以后它变得很花哨了。 - hatmatrix
3
高端而昂贵。R的成本在过去十年中也翻了三倍,但仍然是物超所值的。 :) - Iterator
4个回答

18
你可能想使用一个:pick event

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)

由选择器参数设置的公差:

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

1
pick_event 的更新教程。 - Dawierha

8
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)

4
如果你从future中导入print函数,你需要加上括号:print('X='+str(np.take(xdata, ind)[0]))。 - G M

7

还有没有类似于 identify(x, y) 的等效函数?或者更好的是,能否在例如 Line2D 对象上调用类似于 ginput() 的函数? - James Paul Mason
@James Paul Mason 我不熟悉那个,也许你可以搜索或者提出一个新的问题 :) - ch271828n

0

ginput() 是一个方便的工具,可以从绘制的窗口中选择任意点的 x、y 坐标,但该点可能不属于绘制的数据。要从绘制的数据中选择点的 x、y 坐标,仍然可以使用 'pick_event' 属性和 mpl_connect,如文档中所示的 example。例如:

import matplotlib.pyplot as plt 
import numpy as np
from numpy.random import rand

fig, ax = plt.subplots()
ax.plot(rand(100), rand(100), picker=3)
# 3, for example, is tolerance for picker i.e, how far a mouse click from
# the plotted point can be registered to select nearby data point/points.

def on_pick(event):
    global points
    line = event.artist
    xdata, ydata = line.get_data()
    print('selected point is:',np.array([xdata[ind], ydata[ind]]).T)

cid = fig.canvas.mpl_connect('pick_event', on_pick)

上面的最后一行将把图表与'pick_event'连接起来,每次在图表上单击鼠标时,最近的绘图点坐标将继续打印,要结束此过程,我们需要使用'mpl_disconnect',如下所示:
fig.canvas.mpl_disconnect(cid)

ind未定义! - A.Najafi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接