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 re模块介绍
Nov 30 Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 Python
Python3 Random模块代码详解
Dec 04 Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
使用python3实现操作串口详解
Jan 01 Python
如何通过python的fabric包完成代码上传部署
Jul 29 Python
Python爬虫 urllib2的使用方法详解
Sep 23 Python
pytorch 实现在预训练模型的 input上增减通道
Jan 06 Python
解决python父线程关闭后子线程不关闭问题
Apr 25 Python
Python第三方包PrettyTable安装及用法解析
Jul 08 Python
Python爬虫使用bs4方法实现数据解析
Aug 25 Python
Python访问Redis的详细操作
Jun 26 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
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
python进程与线程小结实例分析
2018/11/11 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
js中的触发事件对象event.srcElement与event.target详解
2017/03/15 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
Angular2整合其他插件的方法
2018/01/20 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
基于Vue 撸一个指令实现拖拽功能
2019/10/09 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
python查询sqlite数据表的方法
2015/05/08 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
python 代码运行时间获取方式详解
2020/09/18 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
飞利浦西班牙官方网站:Philips西班牙
2020/02/17 全球购物
做人民满意的公务员活动方案
2014/08/25 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android