matplotlib交互式数据光标mpldatacursor的实现


Posted in Python onFebruary 03, 2021

简介

mpldatacursor包可以为matplotlib提供交互式的数据光标(弹出式注释框)。
它的典型功能是:

  • 鼠标左键单击图表数据元素时会弹出文本框显示最近的数据元素的坐标值。
  • 鼠标右键单击文本框取消显示数据光标。
  • d键时切换显示\关闭数据光标。

matplotlib交互式数据光标mpldatacursor的实现 

安装

如果matplotlib版本低于3.3可以直接使用pip安装

pip install mpldatacursor

如果matplotlib版本高于3.3,虽然pip安装成功,但是运行案例时会出现AttributeError: 'ScalarFormatter' object has no attribute 'pprint_val'错误。

通过查看源码可知:

try:
  # Again, older versions of mpl
  return formatter.pprint_val(x)
except AttributeError:
  # 3.3.0 or later
  return formatter.format_data_short(x)

通过分析,预计是因为使用了国内pip源,mpldatacursor包还未修复该问题(pip 安装的 mpldatacursor包版本号是0.7.1)。

因此,建议到https://github.com/joferkington/mpldatacursor

下载源码,进行源码安装(源码安装的 mpldatacursor包版本号是0.7.dev0)。

python setup.py install

基本应用(官方实例)解析

应用流程

mpldatacursor包基本应用方式比较简单:

  • mpldatacursor包中导入datacursor函数。
  • 应用datacursor函数。

 包结构

查看源码可知,mpldatacursor包的结构如下:

mpldatacursor
   convenience.py
   datacursor.py
   pick_info.py
   __init__.py

datacursor函数定义在convenience.py中,datacursor函数的返回值是DataCursor类实例。
DataCursor类定义在datacursor.py中。
pick_info.py定义了一系列和弹出文本框相关的函数,供DataCursor类调用。

datacursor函数定义

datacursor函数定义可知:

  • datacursor函数可以不提供参数,这样图像内所有数据元素都会应用交互式数据光标。
  • datacursor函数可以指定哪些数据元素应用交互式数据光标。
def datacursor(artists=None, axes=None, **kwargs):
  """
  Create an interactive data cursor for the specified artists or specified
  axes. The data cursor displays information about a selected artist in a
  "popup" annotation box.

  If a specific sequence of artists is given, only the specified artists will
  be interactively selectable. Otherwise, all manually-plotted artists in
  *axes* will be used (*axes* defaults to all axes in all figures).

  Parameters
  -----------
  artists : a matplotlib artist or sequence of artists, optional
    The artists to make selectable and display information for. If this is
    not specified, then all manually plotted artists in `axes` will be
    used.
  axes : a matplotlib axes of sequence of axes, optional
    The axes to selected artists from if a sequence of artists is not
    specified. If `axes` is not specified, then all available axes in all
    figures will be used.
  tolerance : number, optional
    The radius (in points) that the mouse click must be within to select
    the artist. Default: 5 points.
  formatter : callable, optional
    A function that accepts arbitrary kwargs and returns a string that will
    be displayed with annotate. Often, it is convienent to pass in the
    format method of a template string, e.g.
    ``formatter="{label}".format``.
    Keyword arguments passed in to the `formatter` function:
      `x`, `y` : floats
        The x and y data coordinates of the clicked point
      `event` : a matplotlib ``PickEvent``
        The pick event that was fired (note that the selected
        artist can be accessed through ``event.artist``).
      `label` : string or None
        The legend label of the selected artist.
      `ind` : list of ints or None
        If the artist has "subitems" (e.g. points in a scatter or
        line plot), this will be a list of the item(s) that were
        clicked on. If the artist does not have "subitems", this
        will be None. Note that this is always a list, even when
        a single item is selected.
    Some selected artists may supply additional keyword arguments that
    are not always present, for example:
      `z` : number
        The "z" (usually color or array) value, if present. For an
        ``AxesImage`` (as created by ``imshow``), this will be the
        uninterpolated array value at the point clicked. For a
        ``PathCollection`` (as created by ``scatter``) this will be the
        "c" value if an array was passed to "c".
      `i`, `j` : ints
        The row, column indicies of the selected point for an
        ``AxesImage`` (as created by ``imshow``)
      `s` : number
        The size of the selected item in a ``PathCollection`` if a size
        array is specified.
      `c` : number
        The array value displayed as color for a ``PathCollection``
        if a "c" array is specified (identical to "z").
      `point_label` : list
        If `point_labels` is given when the data cursor is initialized
        and the artist has "subitems", this will be a list of the items
        of `point_labels` that correspond to the selected artists.
        Note that this is always a list, even when a single artist is
        selected.
      `width`, `height`, `top`, `bottom` : numbers
        The parameters for ``Rectangle`` artists (e.g. bar plots).
  point_labels : sequence or dict, optional
    For artists with "subitems" (e.g. Line2D's), the item(s) of
    `point_labels` corresponding to the selected "subitems" of the artist
    will be passed into the formatter function as the "point_label" kwarg.
    If a single sequence is given, it will be used for all artists with
    "subitems". Alternatively, a dict of artist:sequence pairs may be given
    to match an artist to the correct series of point labels.
  display : {"one-per-axes", "single", "multiple"}, optional
    Controls whether more than one annotation box will be shown.
    Default: "one-per-axes"
  draggable : boolean, optional
    Controls whether or not the annotation box will be interactively
    draggable to a new location after being displayed. Defaults to False.
  hover : boolean, optional
    If True, the datacursor will "pop up" when the mouse hovers over an
    artist. Defaults to False. Enabling hover also sets
    `display="single"` and `draggable=False`.
  props_override : function, optional
    If specified, this function customizes the parameters passed into the
    formatter function and the x, y location that the datacursor "pop up"
    "points" to. This is often useful to make the annotation "point" to a
    specific side or corner of an artist, regardless of the position
    clicked. The function is passed the same kwargs as the `formatter`
    function and is expected to return a dict with at least the keys "x"
    and "y" (and probably several others).
    Expected call signature: `props_dict = props_override(**kwargs)`
  keybindings : boolean or dict, optional
    By default, the keys "d" and "t" will be bound to deleting/hiding all
    annotation boxes and toggling interactivity for datacursors,
    respectively. If keybindings is False, the ability to hide/toggle
    datacursors interactively will be disabled. Alternatively, a dict of
    the form {'hide':'somekey', 'toggle':'somekey'} may specified to
    customize the keyboard shortcuts.
  date_format : string, optional
    The strftime-style formatting string for dates. Used only if the x or y
    axes have been set to display dates. Defaults to "%x %X".
  display_button: int, optional
    The mouse button that will triggers displaying an annotation box.
    Defaults to 1, for left-clicking. (Common options are 1:left-click,
    2:middle-click, 3:right-click)
  hide_button: int or None, optional
    The mouse button that triggers hiding the selected annotation box.
    Defaults to 3, for right-clicking. (Common options are 1:left-click,
    2:middle-click, 3:right-click, None:hiding disabled)
  keep_inside : boolean, optional
    Whether or not to adjust the x,y offset to keep the text box inside the
    figure. This option has no effect on draggable datacursors. Defaults to
    True. Note: Currently disabled on OSX and NbAgg/notebook backends.
  **kwargs : additional keyword arguments, optional
    Additional keyword arguments are passed on to annotate.

  Returns
  -------
  dc : A ``mpldatacursor.DataCursor`` instance
  """

官方实例源码

import matplotlib.pyplot as plt
import numpy as np
from mpldatacursor import datacursor

data = np.outer(range(10), range(1, 5))

fig, ax = plt.subplots()
lines = ax.plot(data)
ax.set_title('Click somewhere on a line')

datacursor()

plt.show()

限定仅某数据元素使用交互式光标

本实例中,有两个数据元素(artist):line1line2datacursor(line1)函数提供了参数line1,因此只有line1可以使用交互式数据光标,line2则没有效果。

import matplotlib.pyplot as plt
import numpy as np
from mpldatacursor import datacursor
fig, ax = plt.subplots()
line1 = ax.plot([1,3])
line2 = ax.plot([1,2])
ax.set_title('Click somewhere on a line')
datacursor(line1)
plt.show()

matplotlib交互式数据光标mpldatacursor的实现

其他官方实例功能概述

mpldatacursor提供了大量实际案例,详见https://github.com/joferkington/mpldatacursor/tree/master/examples。不再一一分析,仅简单说明功能。

  • basic_single_annotation.py:在多子图情况下,默认每个子图的数据光标是独立的,即每个子图都可以显示数据光标,相互不影响。使用datacursor(display='single')参数后,仅在当前子图显示数据光标,其余子图显示的数据光标自动关闭。
  • change_popup_color.py:提供了两个案例,一个取消了提示框的边框,一个将提示框的背景色改为白色。
  • hover_example.py:将数据光标的触发方式由鼠标左键单击改为鼠标悬浮。
  • show_artist_labels.py:将数据光标默认显示的坐标值改为数据元素的label
  • highlighting_example.py:点击数据元素时,数据元素会高亮(黄色)显示。
  • draggable_example.py:在一个子图中,同时显示多个数据光标。
  • customize_keyboard_shortcuts.py:重新绑定数据光标快捷键。
  • labeled_points_example.py:自定义数据点标签。
  • date_example.py:日期数据显示。
  • bar_example.py:在柱状图中,在每个柱上方鼠标悬浮触发数据光标。

总结

mpldatacursor历史悠久,但是迟迟没有发布支持matplotlib3.3的稳定版,建议源码安装开发版,或者使用mplcursors包https://github.com/anntzer/mplcursors。
mpldatacursor功能上还是挺丰富的,可以作为深入学习matplotlib交互的案例。

到此这篇关于matplotlib交互式数据光标mpldatacursor的实现 的文章就介绍到这了,更多相关matplotlib交互式数据光标内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python读取json文件并将数据插入到mongodb的方法
Mar 23 Python
详解Python的Django框架中的模版继承
Jul 16 Python
python文件名和文件路径操作实例
Sep 29 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
用python编写第一个IDA插件的实例
May 29 Python
python实现学员管理系统
Feb 26 Python
Python中asyncio模块的深入讲解
Jun 10 Python
简单了解python中的与或非运算
Sep 18 Python
Django将默认的SQLite更换为MySQL的实现
Nov 18 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 Python
python套接字socket通信
Apr 01 Python
matplotlib更改窗口图标的方法示例
Feb 03 #Python
python中添加模块导入路径的方法
Feb 03 #Python
浅谈matplotlib默认字体设置探索
Feb 03 #Python
python sleep和wait对比总结
Feb 03 #Python
Python实现简单猜数字游戏
Feb 03 #Python
python 实现图片裁剪小工具
Feb 02 #Python
python向xls写入数据(包括合并,边框,对齐,列宽)
Feb 02 #Python
You might like
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
浅析iis7.5安装配置php环境
2015/05/10 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
php workerman定时任务的实现代码
2018/12/23 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
php异常处理捕获错误整理
2019/09/23 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
后勤人员自我评价怎么写
2013/09/19 职场文书
副董事长岗位职责
2014/04/02 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
Nginx四层负载均衡的配置指南
2021/06/11 Servers