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统计cpu利用率的方法
Jun 02 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
Aug 10 Python
python+django快速实现文件上传
Oct 24 Python
深入理解Python爬虫代理池服务
Feb 28 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
python实现电脑自动关机
Jun 20 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
Python生成词云的实现代码
Jan 14 Python
Python3.6 中的pyinstaller安装和使用教程
Mar 16 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
python中remove函数的踩坑记录
Jan 04 Python
忆童年!用Python实现愤怒的小鸟游戏
Jun 07 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
mysql 字段类型说明
2007/04/27 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
django中的ajax组件教程详解
2018/10/18 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
vue 获取视频时长的实例代码
2019/08/20 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
在Python中定义一个常量的方法
2018/11/10 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
联想美国官方商城:Lenovo美国
2017/06/19 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
EJB timer的种类
2014/10/28 面试题
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
大学计划书范文800字
2014/08/14 职场文书
要账委托书范本
2014/09/15 职场文书
考博导师推荐信范文
2015/03/27 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL