matplotlib绘制多子图共享鼠标光标的方法示例


Posted in Python onJanuary 08, 2021

matplotlib官方除了提供了鼠标十字光标的示例,还提供了同一图像内多子图共享光标的示例,其功能主要由widgets模块中的MultiCursor类提供支持。

MultiCursor类与Cursor类参数类似,差异主要在:

  • Cursor类参数只有一个ax,即需要显示光标的子图;MultiCursor类参数为canvasaxes,其中axes为需要共享光标的子图列表。
  • Cursor类中,光标默认是十字线;MultiCursor类中,光标默认为竖线。

官方示例

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

t = np.arange(0.0, 2.0, 0.01)
s1 = np.sin(2*np.pi*t)
s2 = np.sin(4*np.pi*t)

fig, (ax1, ax2) = plt.subplots(2, sharex=True)
ax1.plot(t, s1)
ax2.plot(t, s2)

multi = MultiCursor(fig.canvas, (ax1, ax2), color='r', lw=1)
plt.show()

matplotlib绘制多子图共享鼠标光标的方法示例

简易修改版

multi = MultiCursor(fig.canvas, (ax1, ax2), color='r', lw=1, horizOn=True, vertOn=True)

matplotlib绘制多子图共享鼠标光标的方法示例

MultiCursor类源码

class MultiCursor(Widget):
  """
  Provide a vertical (default) and/or horizontal line cursor shared between
  multiple axes.

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

  Example usage::

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

    fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)
    t = np.arange(0.0, 2.0, 0.01)
    ax1.plot(t, np.sin(2*np.pi*t))
    ax2.plot(t, np.sin(4*np.pi*t))

    multi = MultiCursor(fig.canvas, (ax1, ax2), color='r', lw=1,
              horizOn=False, vertOn=True)
    plt.show()

  """
  def __init__(self, canvas, axes, useblit=True, horizOn=False, vertOn=True,
         **lineprops):

    self.canvas = canvas
    self.axes = axes
    self.horizOn = horizOn
    self.vertOn = vertOn

    xmin, xmax = axes[-1].get_xlim()
    ymin, ymax = axes[-1].get_ylim()
    xmid = 0.5 * (xmin + xmax)
    ymid = 0.5 * (ymin + ymax)

    self.visible = True
    self.useblit = useblit and self.canvas.supports_blit
    self.background = None
    self.needclear = False

    if self.useblit:
      lineprops['animated'] = True

    if vertOn:
      self.vlines = [ax.axvline(xmid, visible=False, **lineprops)
              for ax in axes]
    else:
      self.vlines = []

    if horizOn:
      self.hlines = [ax.axhline(ymid, visible=False, **lineprops)
              for ax in axes]
    else:
      self.hlines = []

    self.connect()
    
  def connect(self):
    """Connect events."""
    self._cidmotion = self.canvas.mpl_connect('motion_notify_event',
                         self.onmove)
    self._ciddraw = self.canvas.mpl_connect('draw_event', self.clear)

  def disconnect(self):
    """Disconnect events."""
    self.canvas.mpl_disconnect(self._cidmotion)
    self.canvas.mpl_disconnect(self._ciddraw)

  def clear(self, event):
    """Clear the cursor."""
    if self.ignore(event):
      return
    if self.useblit:
      self.background = (
        self.canvas.copy_from_bbox(self.canvas.figure.bbox))
    for line in self.vlines + self.hlines:
      line.set_visible(False)

  def onmove(self, event):
    if self.ignore(event):
      return
    if event.inaxes is None:
      return
    if not self.canvas.widgetlock.available(self):
      return
    self.needclear = True
    if not self.visible:
      return
    if self.vertOn:
      for line in self.vlines:
        line.set_xdata((event.xdata, event.xdata))
        line.set_visible(self.visible)
    if self.horizOn:
      for line in self.hlines:
        line.set_ydata((event.ydata, event.ydata))
        line.set_visible(self.visible)
    self._update()


  def _update(self):
    if self.useblit:
      if self.background is not None:
        self.canvas.restore_region(self.background)
      if self.vertOn:
        for ax, line in zip(self.axes, self.vlines):
          ax.draw_artist(line)
      if self.horizOn:
        for ax, line in zip(self.axes, self.hlines):
          ax.draw_artist(line)
      self.canvas.blit()
    else:
      self.canvas.draw_idle()

到此这篇关于matplotlib绘制多子图共享鼠标光标的方法示例的文章就介绍到这了,更多相关matplotlib 多子图鼠标光标内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 实现选择排序的算法步骤
Apr 22 Python
Python实现的简单计算器功能详解
Aug 25 Python
Python 运行 shell 获取输出结果的实例
Jan 07 Python
python文件写入write()的操作
May 14 Python
python logging通过json文件配置的步骤
Apr 27 Python
python用opencv完成图像分割并进行目标物的提取
May 25 Python
Python数据可视化图实现过程详解
Jun 12 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
基于Python实现粒子滤波效果
Dec 01 Python
Django解决frame拒绝问题的方法
Dec 18 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 21 Python
利用python查看数组中的所有元素是否相同
Jan 08 #Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
Jan 08 #Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 #Python
matplotlib自定义鼠标光标坐标格式的实现
Jan 08 #Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
Jan 08 #Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 #Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 #Python
You might like
使用无限生命期Session的方法
2006/10/09 PHP
网页游戏开发入门教程二(游戏模式+系统)
2009/11/02 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
2015/12/09 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
在微信小程序中保存网络图片
2019/02/12 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
node后端服务保活的实现
2019/11/10 Javascript
Python contextlib模块使用示例
2015/02/18 Python
在Python中调用ggplot的三种方法
2015/04/08 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
python实发邮件实例详解
2019/11/11 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
关于python中导入文件到list的问题
2020/10/31 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
应用数学自荐书范文
2013/11/24 职场文书
幼儿园小班植树节活动方案
2014/03/04 职场文书
大学班级文化建设方案
2014/05/06 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
国际商务专业毕业生自我鉴定2014
2014/09/27 职场文书
家庭贫困证明
2015/06/16 职场文书
外科护士长工作总结
2015/08/12 职场文书
Spring Data JPA使用JPQL与原生SQL进行查询的操作
2021/06/15 Java/Android
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技
mysql序号rownum行号实现方式
2022/12/24 MySQL