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 相关文章推荐
Django imgareaselect手动剪切头像实现方法
May 26 Python
python在控制台输出进度条的方法
Jun 20 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
python多线程之事件Event的使用详解
Apr 27 Python
python 平衡二叉树实现代码示例
Jul 07 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
Jan 03 Python
Python timeit模块的使用实践
Jan 13 Python
python turtle工具绘制四叶草的实例分享
Feb 14 Python
浅析python标准库中的glob
Mar 13 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
Python如何发送与接收大型数组
Aug 07 Python
python状态机transitions库详解
Jun 02 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
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
微信小程序开发探究
2016/12/27 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
Python中文竖排显示的方法
2015/07/28 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
python获取指定时间差的时间实例详解
2017/04/11 Python
对numpy中shape的深入理解
2018/06/15 Python
Python多进程原理与用法分析
2018/08/21 Python
Python如何调用外部系统命令
2019/08/07 Python
关于Python中的向量相加和numpy中的向量相加效率对比
2019/08/26 Python
python计算二维矩形IOU实例
2020/01/18 Python
Python流程控制语句的深入讲解
2020/06/15 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
《自选商场》教学反思
2014/02/14 职场文书
爽歪歪广告词
2014/03/20 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
校本课程教学计划
2015/01/19 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android