在matplotlib中获取矩形选择的数据

2 投票
3 回答
2792 浏览
提问于 2025-04-18 15:55

我正在尝试理解在matplotlib中使用RectangleSelector这个工具。简单来说,我是用imshow来绘制一个二维数组,然后我想用鼠标选择一个矩形区域,并把这个矩形的角落坐标保存下来,以便在后面的代码中使用。我看过matplotlib文档中关于RectangleSelector的用法,但我还是没能获取到这些数据。

import matplotlib as mpl
import bumpy as np
from matplotlib.widgets import RectangleSelector
# let z be my 2D array
z=np.ones((100,1000))
def onselect(eclick, erelease):
  'eclick and erelease are matplotlib events at press and release'
   print ' startposition : (%f, %f)' % (eclick.xdata, eclick.ydata)
   print ' endposition   : (%f, %f)' % (erelease.xdata, erelease.ydata)
   print ' used button   : ', eclick.button

fig=mpl.pylab.figure()
ax=fig.add_subplot(111)
ax.imshow(z,aspect='auto',origin='lower',extent=((0,100,0,1000)))
toggle_selector.RS=RectangleSelector(ax,onselect,drawtype='box',useblit=True,button=[1,3])

目前我做的事情是这样的:在onselect这个函数中,我打印出了矩形的最小和最大坐标(x,y)的值。但是我想把这些值存起来,以便后面使用。我该怎么做呢?

3 个回答

1

为了更详细地补充Navdeep的回答...

rect_selection_coords = toggle_selector.RS.extents
print(rect_selection_coords)
x1, x2, y1, y2 = rect_selection_coords

其他属性可以在这个链接中找到,具体是在github的matplotlib/lib/matplotlib/widgets.py文件的第2296行。

1

如果你仔细阅读文档,你会发现返回的对象有一些属性,比如 extents 和 geometry,这些属性包含了关于选择的所有信息。我虽然晚了三年,但希望这能帮到你。

1

我刚刚创建了几个全局变量,把eclick.xdata、eclick.ydata、erelease.xdata和erelease.ydata的值存储在这些全局变量里。

def onselect(eclick, erelease):
    global index
    global startpos
    global endpos
    print ' startposition : (%f, %f)' % (eclick.xdata, eclick.ydata)
    print ' endposition   : (%f, %f)' % (erelease.xdata, erelease.ydata)
    print ' used button   : ', eclick.button
    startpos[index] = [eclick.xdata, eclick.ydata]
    endpos[index]   = [erelease.xdata, erelease.ydata]

我不确定这是不是“最好”的方法,但它确实有效 :)

撰写回答