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 相关文章推荐
pycharm 使用心得(七)一些实用功能介绍
Jun 06 Python
python中assert用法实例分析
Apr 30 Python
python使用PyGame模块播放声音的方法
May 20 Python
Python实现模拟登录及表单提交的方法
Jul 25 Python
python通过加号运算符操作列表的方法
Jul 28 Python
浅谈Python中的可变对象和不可变对象
Jul 07 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
Python使用add_subplot与subplot画子图操作示例
Jun 01 Python
python实现自动发送报警监控邮件
Jun 21 Python
Python3.6简单的操作Mysql数据库的三个实例
Oct 17 Python
基于Tensorflow批量数据的输入实现方式
Feb 05 Python
解决Python3.8运行tornado项目报NotImplementedError错误
Sep 02 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
生成缩略图
2006/10/09 PHP
一个查看session内容的函数
2006/10/09 PHP
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
php绘制一条直线的方法
2015/01/24 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
jQuery响应鼠标事件并隐藏与显示input默认值
2014/08/24 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
js实现带简单弹性运动的导航条
2017/02/22 Javascript
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
python实现红包裂变算法
2016/02/16 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
ipad上运行python的方法步骤
2019/10/12 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
django项目中新增app的2种实现方法
2020/04/01 Python
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
六五普法规划实施方案
2014/03/21 职场文书
住宅质量保证书
2014/04/29 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
计算机教师工作总结
2015/08/13 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python
Python中else的三种使用场景
2021/06/16 Python
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL