时间:2021-05-22
matplotlib在widgets模块提供Cursor类用于支持十字光标的生成。另外官方还提供了自定义十字光标的实例。
简易十字光标实现
首先在 Cursor类的构造方法__init__中,构造了十字光标的横线、竖线和坐标显示;然后在on_mouse_move方法中,根据事件数据更新横竖线和坐标显示,最后在调用时,通过mpl_connect方法绑定on_mouse_move方法和鼠标移动事件'motion_notify_event'。
import matplotlib.pyplot as pltimport numpy as npclass Cursor: """ A cross hair cursor. """ def __init__(self, ax): self.ax = ax self.horizontal_line = ax.axhline(color='k', lw=0.8, ls='--') self.vertical_line = ax.axvline(color='k', lw=0.8, ls='--') # text location in axes coordinates self.text = ax.text(0.72, 0.9, '', transform=ax.transAxes) def set_cross_hair_visible(self, visible): need_redraw = self.horizontal_line.get_visible() != visible self.horizontal_line.set_visible(visible) self.vertical_line.set_visible(visible) self.text.set_visible(visible) return need_redraw def on_mouse_move(self, event): if not event.inaxes: need_redraw = self.set_cross_hair_visible(False) if need_redraw: self.ax.figure.canvas.draw() else: self.set_cross_hair_visible(True) x, y = event.xdata, event.ydata # update the line positions self.horizontal_line.set_ydata(y) self.vertical_line.set_xdata(x) self.text.set_text('x=%1.2f, y=%1.2f' % (x, y)) self.ax.figure.canvas.draw()x = np.arange(0, 1, 0.01)y = np.sin(2 * 2 * np.pi * x)fig, ax = plt.subplots()ax.set_title('Simple cursor')ax.plot(x, y, 'o')cursor = Cursor(ax)#关键部分,绑定鼠标移动事件处理fig.canvas.mpl_connect('motion_notify_event', cursor.on_mouse_move)plt.show()在简易实现中,每次鼠标移动时,都会重绘整个图像,这样效率比较低。
在优化实现中,每次鼠标移动时,只重绘光标和坐标显示,背景图像不再重绘。
在前面的两种实现中,鼠标十字光标可以随意移动。在本实现中,十字光标只会出现在离鼠标x坐标最近的数据点上。
import matplotlib.pyplot as pltimport numpy as npclass SnappingCursor: """ A cross hair cursor that snaps to the data point of a line, which is closest to the *x* position of the cursor. For simplicity, this assumes that *x* values of the data are sorted. """ def __init__(self, ax, line): self.ax = ax self.horizontal_line = ax.axhline(color='k', lw=0.8, ls='--') self.vertical_line = ax.axvline(color='k', lw=0.8, ls='--') self.x, self.y = line.get_data() self._last_index = None # text location in axes coords self.text = ax.text(0.72, 0.9, '', transform=ax.transAxes) def set_cross_hair_visible(self, visible): need_redraw = self.horizontal_line.get_visible() != visible self.horizontal_line.set_visible(visible) self.vertical_line.set_visible(visible) self.text.set_visible(visible) return need_redraw def on_mouse_move(self, event): if not event.inaxes: self._last_index = None need_redraw = self.set_cross_hair_visible(False) if need_redraw: self.ax.figure.canvas.draw() else: self.set_cross_hair_visible(True) x, y = event.xdata, event.ydata index = min(np.searchsorted(self.x, x), len(self.x) - 1) if index == self._last_index: return # still on the same data point. Nothing to do. self._last_index = index x = self.x[index] y = self.y[index] # update the line positions self.horizontal_line.set_ydata(y) self.vertical_line.set_xdata(x) self.text.set_text('x=%1.2f, y=%1.2f' % (x, y)) self.ax.figure.canvas.draw()x = np.arange(0, 1, 0.01)y = np.sin(2 * 2 * np.pi * x)fig, ax = plt.subplots()ax.set_title('Snapping cursor')line, = ax.plot(x, y, 'o')snap_cursor = SnappingCursor(ax, line)fig.canvas.mpl_connect('motion_notify_event', snap_cursor.on_mouse_move)plt.show()https://www.matplotlib.org.cn/gallery/misc/cursor_demo_sgskip.html
到此这篇关于matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)的文章就介绍到这了,更多相关matplotlib鼠标十字光标 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
matplotlib官方除了提供了鼠标十字光标的示例,还提供了同一图像内多子图共享光标的示例,其功能主要由widgets模块中的MultiCursor类提供支持
cad鼠标的十字光标设置大小的步骤: 1、双击电脑桌面上的CAD软件,打开软件后可以看到的系统默认的CAD十字光标的大小; 2、点击菜单栏上的工具按钮,在弹
本文所述实例主要完成dotNET中实现彩色光标、动画光标及自定义光标的功能。以下是完整的程序实例,可以通过命令行编译可看到运行效果。Test.cs页面代码如下:
由于行业需要,或者个人爱好,需要设置cad十字光标的大小,此处为大家讲解一下cad如何设置十字光标大小。 1、打开cad软件,或者随便打开一个cad文件也
设置word表格复制后格式不变的方法如下: 1、打开Word文档,把鼠标的光标移动需要复制的表格左上角,就会出现一个双向十字箭头。 2、接着用鼠标左键点击这