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 相关文章推荐
zbar解码二维码和条形码示例
Feb 07 Python
python模拟登陆阿里妈妈生成商品推广链接
Apr 03 Python
Python的地形三维可视化Matplotlib和gdal使用实例
Dec 09 Python
浅谈Python中的私有变量
Feb 28 Python
Python理解递归的方法总结
Jan 28 Python
python从入门到精通 windows安装python图文教程
May 18 Python
Python 虚拟空间的使用代码详解
Jun 10 Python
django xadmin 管理器常用显示设置方式
Mar 11 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
Python日志处理模块logging用法解析
May 19 Python
Python如何实现FTP功能
May 28 Python
一些让Python代码简洁的实用技巧总结
Aug 23 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对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
php while循环得到循环次数
2013/10/26 PHP
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
javascript 清空form表单中某种元素的值
2009/12/26 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
jQuery的each循环用法简单示例
2016/06/12 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
2019/06/03 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
vue单文件组件无法获取$refs的问题
2020/06/24 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[01:46]TI4西雅图DOTA2前线报道 中国选手抱团调时差
2014/07/08 DOTA
pytyon 带有重复的全排列
2013/08/13 Python
python中实现k-means聚类算法详解
2017/11/11 Python
使用Python处理Excel表格的简单方法
2018/06/07 Python
python3实现随机数
2018/06/25 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
python列表返回重复数据的下标
2020/02/10 Python
服务器端jupyter notebook映射到本地浏览器的操作
2020/04/14 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
材料化学应届生求职信
2013/10/09 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
Python+Appium新手教程
2021/04/17 Python
Python序列化模块JSON与Pickle
2022/06/05 Python