matplotlib绘制鼠标的十字光标的实现(内置方式)


Posted in Python onJanuary 06, 2021

相对于echarts等基于JavaScript的图表库,matplotlib的交互能力相对较差。
在实际应用中,我们经常想使用十字光标来定位数据坐标,matplotlib内置提供支持。

官方示例

matplotlib提供了官方示例https://matplotlib.org/gallery/widgets/cursor.html

from matplotlib.widgets import Cursor
import numpy as np
import matplotlib.pyplot as plt

# Fixing random state for reproducibility
np.random.seed(19680801)

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, facecolor='#FFFFCC')

x, y = 4*(np.random.rand(2, 100) - .5)
ax.plot(x, y, 'o')
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)

# Set useblit=True on most backends for enhanced performance.
cursor = Cursor(ax, useblit=True, color='red', linewidth=2)

plt.show()

matplotlib绘制鼠标的十字光标的实现(内置方式)

原理

由源码可知,实现十字光标的关键在于widgets模块中的Cursor类。
class matplotlib.widgets.Cursor(ax, horizOn=True, vertOn=True, useblit=False, **lineprops)

  • ax:参数类型matplotlib.axes.Axes,即需要添加十字光标的子图。
  • horizOn:布尔值,是否显示十字光标中的横线,默认值为显示。
  • vertOn:布尔值,是否显示十字光标中的竖线,默认值为显示。
  • useblit:布尔值,是否使用优化模式,默认值为否,优化模式需要后端支持。
  • **lineprops:十字光标线形属性, 参见axhline函数支持的属性,https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.axhline.html#matplotlib.axes.Axes.axhline

简化案例

光标改为灰色竖虚线,线宽为1。

from matplotlib.widgets import Cursor
import matplotlib.pyplot as plt

ax = plt.gca()
cursor = Cursor(ax, horizOn=False, vertOn= True, useblit=False, color='grey', linewidth=1,linestyle='--')
plt.show()

matplotlib绘制鼠标的十字光标的实现(内置方式)

## Cursor类源码

class Cursor(AxesWidget):
  """
  A crosshair cursor that spans the axes and moves with mouse cursor.

  For the cursor to remain responsive you must keep a reference to it.

  Parameters
  ----------
  ax : `matplotlib.axes.Axes`
    The `~.axes.Axes` to attach the cursor to.
  horizOn : bool, default: True
    Whether to draw the horizontal line.
  vertOn : bool, default: True
    Whether to draw the vertical line.
  useblit : bool, default: False
    Use blitting for faster drawing if supported by the backend.

  Other Parameters
  ----------------
  **lineprops
    `.Line2D` properties that control the appearance of the lines.
    See also `~.Axes.axhline`.

  Examples
  --------
  See :doc:`/gallery/widgets/cursor`.
  """

  def __init__(self, ax, horizOn=True, vertOn=True, useblit=False,
         **lineprops):
    AxesWidget.__init__(self, ax)

    self.connect_event('motion_notify_event', self.onmove)
    self.connect_event('draw_event', self.clear)

    self.visible = True
    self.horizOn = horizOn
    self.vertOn = vertOn
    self.useblit = useblit and self.canvas.supports_blit

    if self.useblit:
      lineprops['animated'] = True
    self.lineh = ax.axhline(ax.get_ybound()[0], visible=False, **lineprops)
    self.linev = ax.axvline(ax.get_xbound()[0], visible=False, **lineprops)

    self.background = None
    self.needclear = False

  def clear(self, event):
    """Internal event handler to clear the cursor."""
    if self.ignore(event):
      return
    if self.useblit:
      self.background = self.canvas.copy_from_bbox(self.ax.bbox)
    self.linev.set_visible(False)
    self.lineh.set_visible(False)
    
  def onmove(self, event):
    """Internal event handler to draw the cursor when the mouse moves."""
    if self.ignore(event):
      return
    if not self.canvas.widgetlock.available(self):
      return
    if event.inaxes != self.ax:
      self.linev.set_visible(False)
      self.lineh.set_visible(False)

      if self.needclear:
        self.canvas.draw()
        self.needclear = False
      return
    self.needclear = True
    if not self.visible:
      return
    self.linev.set_xdata((event.xdata, event.xdata))

    self.lineh.set_ydata((event.ydata, event.ydata))
    self.linev.set_visible(self.visible and self.vertOn)
    self.lineh.set_visible(self.visible and self.horizOn)

    self._update()

  def _update(self):
    if self.useblit:
      if self.background is not None:
        self.canvas.restore_region(self.background)
      self.ax.draw_artist(self.linev)
      self.ax.draw_artist(self.lineh)
      self.canvas.blit(self.ax.bbox)
    else:
      self.canvas.draw_idle()
    return False

到此这篇关于matplotlib绘制鼠标的十字光标的实现(内置方式)的文章就介绍到这了,更多相关matplotlib 十字光标内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
整理Python最基本的操作字典的方法
Apr 24 Python
使用Python的PIL模块来进行图片对比
Feb 18 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
Jun 28 Python
wxPython之解决闪烁的问题
Jan 15 Python
python3使用flask编写注册post接口的方法
Dec 28 Python
Python的条件表达式和lambda表达式实例
Jan 31 Python
python画图的函数用法以及技巧
Jun 28 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 Python
windows下python安装pip方法详解
Feb 10 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
Python截图并保存的具体实例
Jan 14 Python
java字符串格式化输出实例讲解
Jan 06 #Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 #Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 #Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
Jan 05 #Python
Python读取ini配置文件传参的简单示例
Jan 05 #Python
matplotlib实现数据实时刷新的示例代码
Jan 05 #Python
Matplotlib配色之Colormap详解
Jan 05 #Python
You might like
PHP JSON 数据解析代码
2010/05/26 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
html下载本地
2006/06/19 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
javascript实现简单的可随机变色网页计算器示例
2016/12/30 Javascript
JS完成画圆圈的小球
2017/03/07 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
python处理圆角图片、圆形图片的例子
2014/04/25 Python
Python如何快速实现分布式任务
2017/07/06 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
手写一个python迭代器过程详解
2019/08/27 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
Pandas直接读取sql脚本的方法
2021/01/21 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
高职助产应届生自荐信
2013/09/24 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
金融管理专业毕业生求职信
2014/03/12 职场文书
环保项目建议书
2014/08/26 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
工程部文员岗位职责
2015/02/04 职场文书
Python  lambda匿名函数和三元运算符
2022/04/19 Python