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使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 Python
浅析Python中的序列化存储的方法
Apr 28 Python
Python模拟用户登录验证
Sep 11 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
Python基于whois模块简单识别网站域名及所有者的方法
Apr 23 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
python做反被爬保护的方法
Jul 01 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
Jul 18 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
python os.rename实例用法详解
Dec 06 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
GD输出汉字的函数的分析
2006/10/09 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
php中动态修改ini配置
2014/10/14 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
php常用字符函数实例小结
2016/12/29 PHP
详解php中的implements 使用
2017/06/13 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
经验几则 推荐
2006/09/05 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
javascript中window.event事件用法详解
2012/12/11 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
Javascript window对象详解
2014/11/12 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
nodejs express配置自签名https服务器的方法
2018/05/22 NodeJs
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
python的继承知识点总结
2018/12/10 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
Django实现网页分页功能
2019/10/31 Python
Python实现分数序列求和
2020/02/25 Python
乡镇网格化管理实施方案
2014/03/23 职场文书
党政领导班子民主生活会整改措施
2014/09/18 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
学生党员检讨书范文
2014/12/27 职场文书