matplotlib 范围选区(SpanSelector)的使用


Posted in Python onFebruary 24, 2021

范围选区概述

范围选区是一种常见的对象选择方式,在一个子图中,可以在某一个轴方向上用鼠标选择起始范围的数据,这个特性可用来实现数据缩放(datazoom)。在matplotlib中的范围选区属于部件(widgets),matplotlib中的部件都是中性(neutral )的,即与具体后端实现无关。

范围选区具体实现定义为matplotlib.widgets.SpanSelector类,继承关系为:Widget->AxesWidget->_SelectorWidget->SpanSelector

SpanSelector类的签名为class matplotlib.widgets.SpanSelector(ax, onselect, direction, minspan=None, useblit=False, rectprops=None, onmove_callback=None, span_stays=False, button=None)

SpanSelector类构造函数的参数为:

  • ax:范围选区生效的子图,类型为matplotlib.axes.Axes的实例。
  • onselect:范围选区完成后执行的回调函数,函数签名为def func(min, max)minmax的数据类型均为浮点数,表示选区在某个坐标轴方向上的最小值和最大值。
  • direction:范围选区的坐标轴方向,取值范围为{"horizontal", "vertical"},类型为字符串。
  • minspan:选区的最小范围,选区范围小于minspan将不会触发onselectrectprops:范围选区的外观的属性,默认值为None
  • span_stays:布尔值,是否在鼠标释放后仍然保留选区,默认值为False
  • onmove_callback:当选区确定后移动鼠标触发的回调函数,函数签名为def func(min, max)minmax的数据类型均为浮点数,默认值为None

SpanSelector类中的state_modifier_keys公有变量 state_modifier_keys定义了操作快捷键,类型为字典。

案例:范围选取基本实现

官方案例一,范围选区基本实现。

案例说明

matplotlib 范围选区(SpanSelector)的使用

单击鼠标拖动到适当位置释放鼠标形成范围选区,选区为透明度0.5蓝色,控制台输出选区在横坐标轴上的最大、最小坐标。
控制台输出:

1.569758064516129 2.0044354838709677

案例代码

import matplotlib.pyplot as plt
import matplotlib.widgets as mwidgets
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [10, 50, 100])
def onselect(vmin, vmax):
  print(vmin, vmax)
rectprops = dict(facecolor='blue', alpha=0.5)
span = mwidgets.SpanSelector(ax, onselect, 'horizontal',span_stays=True,
               rectprops=rectprops)
plt.show()

案例:数据缩放功能

官方案例,https://matplotlib.org/gallery/widgets/span_selector.html

案例说明

matplotlib 范围选区(SpanSelector)的使用

在上方子图单击鼠标拖动到适当位置释放鼠标形成范围选区,选区为红色,下方子图重绘为选定区域内数据系列,起到了数据放大的效果。

案例代码

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector

# Fixing random state for reproducibility
np.random.seed(19680801)

fig, (ax1, ax2) = plt.subplots(2, figsize=(8, 6))
ax1.set(facecolor='#FFFFCC')

x = np.arange(0.0, 5.0, 0.01)
y = np.sin(2*np.pi*x) + 0.5*np.random.randn(len(x))

ax1.plot(x, y, '-')
ax1.set_ylim(-2, 2)
ax1.set_title('Press left mouse button and drag to test')

ax2.set(facecolor='#FFFFCC')
line2, = ax2.plot(x, y, '-')


def onselect(xmin, xmax):
  indmin, indmax = np.searchsorted(x, (xmin, xmax))
  indmax = min(len(x) - 1, indmax)

  thisx = x[indmin:indmax]
  thisy = y[indmin:indmax]
  line2.set_data(thisx, thisy)
  ax2.set_xlim(thisx[0], thisx[-1])
  ax2.set_ylim(thisy.min(), thisy.max())
  fig.canvas.draw()
  
span = SpanSelector(ax1, onselect, 'horizontal', useblit=True, span_stays=True,
          rectprops=dict(alpha=0.5, facecolor='red'))
# Set useblit=True on most backends for enhanced performance.

plt.show()

到此这篇关于matplotlib 范围选区(SpanSelector)的使用的文章就介绍到这了,更多相关matplotlib 范围选区内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现保存网页到本地示例
Mar 16 Python
Python对象体系深入分析
Oct 28 Python
Python断言assert的用法代码解析
Feb 03 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
Python3中lambda表达式与函数式编程讲解
Jan 14 Python
Python Flask框架模板操作实例分析
May 03 Python
python Django编写接口并用Jmeter测试的方法
Jul 31 Python
Python实现语音识别和语音合成功能
Sep 20 Python
利用python3 的pygame模块实现塔防游戏
Dec 30 Python
Keras 加载已经训练好的模型进行预测操作
Jun 17 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 Python
Python实现区域填充的示例代码
Feb 03 Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 24 #Python
matplotlib部件之套索Lasso的使用
Feb 24 #Python
matplotlib之属性组合包(cycler)的使用
Feb 24 #Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 #Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 #Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 #Python
pandas map(),apply(),applymap()区别解析
Feb 24 #Python
You might like
PHP+DBM的同学录程序(5)
2006/10/09 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
Javascript的构造函数和constructor属性
2010/01/09 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
JavaScript中Function详解
2015/02/27 Javascript
基于javascript实现随机颜色变化效果
2016/01/14 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
如何使用JS console.log()技巧提高工作效率
2020/10/14 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
学习python (2)
2006/10/31 Python
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
Python探索之Metaclass初步了解
2017/10/28 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
.net C#面试题
2012/08/28 面试题
2014年党员评议表自我评价
2014/09/27 职场文书
工人先锋号申报材料
2014/12/29 职场文书
入伍通知书
2015/04/23 职场文书
小学生暑假安全公约
2015/07/14 职场文书
详解在OpenCV中如何使用图像像素
2022/03/03 Python
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android