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 代码
Sep 07 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
mac 安装python网络请求包requests方法
Jun 13 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
python使用参数对嵌套字典进行取值的方法
Apr 26 Python
python图的深度优先和广度优先算法实例分析
Oct 26 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
Dec 18 Python
Python响应对象text属性乱码解决方案
Mar 31 Python
详解python中GPU版本的opencv常用方法介绍
Jul 24 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
Sep 20 Python
教你用Python写一个植物大战僵尸小游戏
Apr 25 Python
Python使用scapy模块发包收包
May 07 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/11/07 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
详解原生JS回到顶部
2019/03/25 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
OpenCV实现人脸识别
2017/04/07 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
儿童python练习实例
2018/05/27 Python
python 随机森林算法及其优化详解
2019/07/11 Python
Python实现中值滤波去噪方式
2019/12/18 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
Python字典取键、值对的方法步骤
2020/09/30 Python
Python修改DBF文件指定列
2020/12/19 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
html5菜单折纸效果
2014/04/22 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
大学生职业生涯十年规划书范文
2014/09/17 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
升职自荐信怎么写
2015/03/05 职场文书
nginx 添加http_stub_status_module模块
2022/05/25 Servers