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 web程序
Sep 11 Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 Python
Python遍历numpy数组的实例
Apr 04 Python
Django-Rest-Framework 权限管理源码浅析(小结)
Nov 12 Python
python找出完数的方法
Nov 12 Python
python Selenium实现付费音乐批量下载的实现方法
Jan 24 Python
值得收藏的10道python 面试题
Apr 15 Python
python2和python3在处理字符串上的区别详解
May 29 Python
python实现字符串完美拆分split()的方法
Jul 16 Python
python Django里CSRF 对应策略详解
Aug 05 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 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
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
微信小程序 require机制详解及实例代码
2016/12/14 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
Python进阶学习之特殊方法实例详析
2017/12/01 Python
python获取服务器响应cookie的实例
2018/12/28 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
基于sklearn实现Bagging算法(python)
2019/07/11 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
2019/08/22 Python
python tkinter基本属性详解
2019/09/16 Python
Python 解析简单的XML数据
2020/07/24 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
Java语言的优势
2015/01/10 面试题
final, finally, finalize的区别
2012/03/01 面试题
一分钟演讲稿
2014/04/30 职场文书
共青团员自我评价范文
2014/09/14 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
MySQL学习之基础操作总结
2022/03/19 MySQL
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL