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使用函数默认值实现函数静态变量的方法
Aug 18 Python
django开发之settings.py中变量的全局引用详解
Mar 29 Python
解决Python字典写入文件出行首行有空格的问题
Sep 27 Python
python中map()函数的使用方法示例
Sep 29 Python
浅谈flask中的before_request与after_request
Jan 20 Python
Python进度条实时显示处理进度的示例代码
Jan 30 Python
tensorflow实现KNN识别MNIST
Mar 12 Python
python 实现语音聊天机器人的示例代码
Dec 02 Python
python实现手机销售管理系统
Mar 19 Python
详解解决Python memory error的问题(四种解决方案)
Aug 08 Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 Python
python 实现读取csv数据,分类求和 再写进 csv
May 18 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
php微信开发自定义菜单
2016/08/27 PHP
js 日期转换成中文格式的函数
2009/07/07 Javascript
JS delegate与live浅析
2013/12/21 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
tab栏切换原理
2017/03/22 Javascript
js中apply与call简单用法详解
2017/11/06 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
[03:07]2015国际邀请赛选手档案EHOME.rOtK 是什么让他落泪?
2015/07/31 DOTA
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
分析经典Python开发工程师面试题
2019/04/08 Python
超实用的 30 段 Python 案例
2019/10/10 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
python如何把字符串类型list转换成list
2020/02/18 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
美国休闲服装品牌:Express
2016/09/24 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
商得四方公司面试题(gid+)
2014/04/30 面试题
优秀通讯员事迹材料
2014/01/28 职场文书
教师通用专业自荐书范文
2014/02/11 职场文书
阅兵口号
2014/06/19 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
内勤岗位职责范本
2015/04/13 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书