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列表推导式的使用方法
Nov 21 Python
python中split方法用法分析
Apr 17 Python
python获取外网ip地址的方法总结
Jul 02 Python
解析Python中的__getitem__专有方法
Jun 27 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
Nov 07 Python
python 同时读取多个文件的例子
Jul 16 Python
python代码实现逻辑回归logistic原理
Aug 07 Python
python datetime中strptime用法详解
Aug 29 Python
Python的Lambda函数用法详解
Sep 03 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
PyQt5 界面显示无响应的实现
Mar 26 Python
Python 爬取淘宝商品信息栏目的实现
Feb 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
php上传、管理照片示例
2006/10/09 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
TP3.2框架分页相关实现方法分析
2020/06/03 PHP
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
用jquery仿做发微博功能示例
2014/04/18 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
javascript中caller和callee详解
2015/08/10 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
Python函数嵌套实例
2014/09/23 Python
python实现折半查找和归并排序算法
2017/04/14 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
2018/05/10 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
python读取大文件越来越慢的原因与解决
2019/08/08 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
Python:slice与indices的用法
2019/11/25 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
精灵市场:Pixie Market
2019/06/18 全球购物
高分子材料与工程专业个人求职信
2013/12/15 职场文书
行政专员岗位职责
2014/01/02 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
三年级学生评语
2014/04/23 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS