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写asp详细讲解
Dec 16 Python
使用Python判断质数(素数)的简单方法讲解
May 05 Python
Python实现的快速排序算法详解
Aug 01 Python
利用python求解物理学中的双弹簧质能系统详解
Sep 29 Python
matplotlib调整子图间距,调整整体空白的方法
Aug 03 Python
Python获取航线信息并且制作成图的讲解
Jan 03 Python
Python QQBot库的QQ聊天机器人
Jun 19 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
python里glob模块知识点总结
Jan 05 Python
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
May 14 Python
详解python的异常捕获
Mar 03 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/09/03 PHP
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
浅析php变量作用域的一些问题
2013/08/08 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
php中实现获取随机数组列表的自定义函数
2015/04/02 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
微信小程序 wxapp导航 navigator详解
2016/10/31 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
python实现问号表达式(?)的方法
2013/11/27 Python
Python OS模块常用函数说明
2015/05/23 Python
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
VTK与Python实现机械臂三维模型可视化详解
2017/12/13 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
Python 定义只读属性的实现方式
2020/03/05 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
计算机专业毕业生推荐信
2013/11/25 职场文书
董事长秘书岗位职责
2013/11/29 职场文书
英语简历自我评价
2014/01/26 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
会计个人实习计划书
2014/08/15 职场文书
教师自我剖析材料(四风问题)
2014/09/30 职场文书
2015年大学宣传部工作总结
2015/05/26 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
关于Vue中的options选项
2022/03/22 Vue.js
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js