GUI编程—欢迎来到PyQtGraph-中文版(上)!

**欢迎访问我自己的博客网站:[www.fengwanqing.xin](http://www.fengwanqing.xin)**

最近在学习GUI编程,想要寻找一个画图非常漂亮的库,偶然间发现了PyQtGraph库!用这个库做出来的图非常漂亮!给大家展示一下:
GUI编程—欢迎来到PyQtGraph-中文版(上)!_第1张图片
最近都在钻研这个库,但是没有中文文档,所以笔者就一边看英文文档顺便翻译一下,方便以后查阅(说白了就是英语不好!不能一眼扫到想查的东西!)咳咳~~后续可能还会写一下自己GUI编程的心得。

一、介绍

1.1 什么是pyqtgraph?

PyQtGraph是纯Python图形GUI库,它充分利用PyQt和PtSide的高质量的图形表现水平和NumPy的快速科学计算与处理能力,在数学、科学和工程领域都有广泛的应用。 其主要目标是:

 

  1. 为数据(绘图,视频等)提供快速可交互式图形显示。
  2. 提供帮助快速开发应用程序的工具(例如,Qt Designer中使用的属性树)。

PyQtGraph被大量应用于Qt GUI平台(通过PyQt或PySide),因为它的高性能图形和numpy可用于大量数据处理。 特别注意的是,pyqtgraph使用了Qt的GraphicsView框架,它本身是一个功能强大的图形系统; 我们将最优化和简化的语句应用到这个框架中,以最小的工作量实现数据可视化。

支持Linux,Windows和OSX系统

1.2 它可以做什么?

pyqtgraph的核心特征是:

 

  • 基本的2D交互视图中框绘制
  • 线和散点图
  • 数据可平移/缩放鼠标
  • 实时数据的显示和交互的快速绘制
  • 图像显示与互动的查找表和电平控制
  • 显示所有数据类型(int或float;任何比特深度;RGB,RGBA,或亮度)
  • 切片的多维图像任意角度的函数
  • 快速更新的视频显示和实时交互
  • 三维图形系统(需要Python OpenGL绑定)
  • 体积数据的渲染
  • 三维表面和散点图
  • 网格的等值面生成渲染
  • 交互式视口旋转/缩放鼠标
  • 更容易编程的基本的3D场景图
  • 数据选择/标记和感兴趣的控制区
  • 交互标记垂直/水平的地块的位置和区域
  • 从图像中选择任意区域的部件和自动切片数据匹配

1.3 例子

 PyQtGraph包含一系列可通过运行来访问的示例:

import pyqtgraph.examples
pyqtgraph.examples.run()

这将启动一个启动器并列出可用的示例。 从列表中选择一个项目以查看其源代码,然后双击一个项目以运行该示例。
注意如果你已经用python setup.py开发安装pyqtgraph,那么这些例子就会被错误地提示为top-level module。 在这种情况下,使用导入示例:examples.run()。

1.4 与其他绘图库对比

  • matplotlib:对于绘图而言,pyqtgraph几乎不像matplotlib完整或者成熟,但运行速度更快。 Matplotlib的目标更多是制作出版质量的图形,而pyqtgraph则用于数据采集和分析应用。Matplotlib对于matlab程序员来说更直观。pyqtgraph对python/qt程序员更直观。Matplotlib(据我所知)并不包含许多pyqtgraph的功能,如图像交互,体绘制,参数树,流程图等。
  • pyqwt5:大概和pyqwt5一样快,但对绘图功能来说不完全一样。 pyqtgraph中的图像处理更完整(同样,qwt中没有ROI小部件)。 另外,pyqtgraph是用纯python编写的,所以它比pyqwt更易于移植,pyqwt在开发中经常落后于pyqt(我最初使用pyqwt,但认为在我的项目中依赖它是太麻烦了)。 就像matplotlib一样,pyqwt(据我所知)并不包含很多pyqtgraph的特性,比如图像交互,体积渲染,参数树,流程图等。

二、鼠标交互

大多数使用pyqtgraph数据可视化的应用程序都会生成可交互缩放,平移和使用鼠标配置的小部件。 本节介绍鼠标与这些小部件的交互。

2.1二维图形

在pyqtgraph中,大多数2D可视化遵循以下鼠标交互:

  • 左键:与场景中的项目交互(选择/移动对象等)。 如果鼠标光标下没有可移动的物体,那么用左边的按钮拖动就会平移场景。
  • 右键拖动:缩放场景。 水平拖动左/右缩放; 向上/向下拖动垂直缩放(尽管某些场景将其x / y缩放比例锁定在一起)。 如果在场景中有x / y轴可以闪动,那么右键拖动轴会影响该轴。
  • 右键单击:在大多数情况下单击右键将根据鼠标光标下的对象显示具有各种选项的上下文菜单。
  • 中间按钮(或滚轮)拖动:按下滚轮拖动鼠标将始终平移场景(在场景中其他对象阻止左侧平移的情况下,此功能非常有用)。
  • 轮旋转:放大和缩小场景。

对于使用右侧或中间按钮拖动很困难的机器(通常是Mac),存在另一种鼠标交互模式。 在此模式下,用鼠标左键拖动可在场景的某个区域上绘制一个框。 按钮释放后,场景将缩放并平移以适合框。 可以在上下文菜单中或通过调用以下方式访问此模式:
   

pyqtgraph.setConfigOption('leftButtonPan', False)

2.2 上下文菜单

右键单击大多数场景将显示一个上下文菜单,其中包含用于更改场景行为的各种选项。 这个菜单中的一些选项是:

  • 数据范围变化时启用/禁用自动缩放
  • 将多个视图的轴链接在一起
  • 启用禁用每个轴的鼠标交互
  • 显式设置可见范围值

菜单中可用的确切项目取决于场景的内容和点击的对象。

2.3 三维图形

3D可视化使用以下鼠标交互:

  • 左键拖动:围绕中心点旋转场景
  • 中间按钮拖动:通过移动x-y平面内的中央“查看”点来平移场景
  • 中间按钮拖动+ CTRL:通过沿z轴移动中央“查看”点来平移场景
  • 滚轮旋转:放大/缩小
  • 车轮+ CTRL:改变视场角

键盘控制:

  • 箭头键围绕中心点旋转,就像拖动鼠标左键一样

三、如何使用pyqtgraph?

这里有几个建议使用pyqtgraph的方法:

  • 从交互式shell(python -i,ipython等)
  • 显示应用程序的弹出窗口
  • 将小部件嵌入到PyQt应用程序中

3.1 使用命令行

PyQtGraph使得从命令行可视化数据变得非常容易。注意:

import pyqtgraph as pg
pg.plot(data)   # data can be a list of values or a numpy array

上面的例子将打开一个窗口,显示给定数据的线图。 对pg.plot的调用返回创建的绘图窗口小部件的句柄,从而允许将更多数据添加到同一个窗口。 注意:python提示符中的交互式绘图仅适用于PyQt; 在交互式提示符运行时,PySide不运行Qt事件循环。 如果你想与PySide交互使用pyqtgraph,请参阅'console'示例。

其他例子:

pw = pg.plot(xVals, yVals, pen='r')  # plot x vs y in red
pw.plot(xVals, yVals2, pen='b')

win = pg.GraphicsWindow()  # Automatically generates grids with multiple items
win.addPlot(data1, row=0, col=0)
win.addPlot(data2, row=0, col=1)
win.addPlot(data3, row=1, col=0, colspan=2)

pg.show(imageData)  # imageData must be a numpy array with 2 to 4 dimensions

我们在这里只是展示最基本的用法 - 这些函数接受许多不同的数据格式和选项来自定义数据的外观。

3.2 在应用程序中显示窗口

虽然我认为这种方法有些懒惰,但“懒惰”往往与“高效”无法区分。 这里的方法很简单,就是使用与命令行相同的功能,但是在现有的应用程序中使用。 当我只是想立即获得关于应用程序中数据状态的反馈时,我经常使用它,而无需花时间为其构建用户界面。

3.3 在PyQt应用程序中嵌入小部件

对于认真的应用程序开发人员来说,pyqtgraph中的所有功能都可以通过像其他任何Qt小部件一样嵌入来使用。 更多的重要信息,请参阅:``lotWidget``,``ImageView``,``GraphicsLayoutWidget``和``GraphicsView``。 PyQtGraph的小部件可以通过“Promote To ...”功能包含在Designer的ui文件中:

  1. Designer中,创建一个QGraphicsView小部件(“Graphics View”类别下的“Display Widgets”)。
  2. 用鼠标右键单击QGraphicsView并选择““Promote To...”。
  3. 在“Promoted calss name”下,输入您希望使用的类名称(“PlotWidget”,“GraphicsLayoutWidget”等)。
  4. 在“Header file”下,输入“pyqtgraph”。
  5. 点击“Add”,然后点击“Promote”。

有关promoting widgets的更多信息,请参阅设计器文档。“VideoSpeedTest”和“ScatterPlotSpeedTest”示例都演示了如何使用pyui4或pyside-uic编译为.py模块的.ui文件。“designerExample”示例演示从.ui文件动态生成python类(不需要pyuic4 / pyside-uic)。

3.4 PyQt and PySide

PyQtGraph支持两种常用的Qt库python包:PyQt和PySide。 这两个软件包提供了几乎相同的API和功能,但由于各种原因,您可能更喜欢使用一个软件包或其他软件包。 当第一次导入pyqtgraph时,它会通过一下检测来确定使用哪个库:

  1. 如果PyQt4已经导入,请使用它
  2. 否则,如果PySide已经导入,就使用它
  3.  否则,尝试导入PyQt4
  4. 如果导入失败,请尝试导入PySide。

如果你的系统上已经安装了这两个库,并且你想强制pyqtgraph使用其中一个或者另一个,只需确保它在pyqtgraph之前被导入:
    

import PySide  ## this will force pyqtgraph to use PySide instead of PyQt4
    import pyqtgraph as pg

3.5 将PyQtGraph库导入到大型项目中

在编写使用pyqtgraph的应用程序或python包时,通常在系统范围内(或在virtualenv中)安装pyqtgraph,并在应用程序内调用import pyqtgraph。 这样做的主要好处是pyqtgraph是独立于应用程序进行配置的,因此您(或您的用户)可以自由安装较新版本的pyqtgraph,而无需在应用程序中更改任何内容。 这是用python开发时的标准做法。

然而,特别是对于科学应用来说,情况也是如此,即软件是为特定目的而编写的,然后进行存档。如果我们想要确保软件在十年后仍能正常工作,那么最好将应用程序绑定到一个特定版本的pyqtgraph上,并避免导入系统安装的pyqtgraph版本,这可能会更新(可能不兼容)。尤其当应用程序需要对主要版本中可能不存在的pyqtgraph软件包进行特定的修改时,情况如此。

PyQtGraph通过两种机制来促进这种用法。首先,pyqtgraph中的所有内部导入语句都是相对的,它允许将包重命名或用作子包,而不会与系统中其他版本的pyqtgraph产生任何命名冲突(即,pyqtgraph从未在内部将其自身称为“pyqtgraph ”)。其次,可以在 https://github.com/pyqtgraph/pyqtgraph-core.git 找到一个git树状子目录存储库,它只包含'pyqtgraph /'树状子目录,允许将代码直接克隆为使用它的应用程序的子目录。
 

基本的方法是将存储库克隆到包中的适当位置。从包中导入pyqtgraph时,一定要使用全名来避免导入任何系统安装的pyqtgraph包。例如,假设一个简单的项目具有以下结构:

my_project/
    __init__.py
    plotting.py
        """Plotting functions used by this package"""
        import pyqtgraph as pg
        def my_plot_function(*data):
            pg.plot(*data)

要导入特定版本的pyqtgraph,我们将克隆项目中的pyqtgraph-core存储库:
 

my_project$ git clone https://github.com/pyqtgraph/pyqtgraph-core.git

然后相应地调整导入语句:

my_project/
    __init__.py
    pyqtgraph/
    plotting.py
        """Plotting functions used by this package"""
        import my_project.pyqtgraph as pg  # be sure to use the local subpackage
                                           # rather than any globally-installed
                                           # versions.
        def my_plot_function(*data):
            pg.plot(*data)

使用 git checkout pyqtgraph-core-x.x.x 选择特定版本的存储库,或使用 git pull 从上游拉取pyqtgraph更新(有关更多信息,请参阅git文档)。
 

对于已经使用git进行代码控制的项目,也可以在你自己的仓库中包含pyqtgraph作为git树状子目录。 这种方法的主要优点是,除了能够从上游存储库中获取pyqtgraph更新之外,还可以将本地pyqtgraph更改提交到项目存储库并向上游推送这些更改:

my_project$ git remote add pyqtgraph-core https://github.com/pyqtgraph/pyqtgraph-core.git
my_project$ git fetch pyqtgraph-core
my_project$ git merge -s ours --no-commit pyqtgraph-core/core
my_project$ mkdir pyqtgraph
my_project$ git read-tree -u --prefix=pyqtgraph/ pyqtgraph-core/core
my_project$ git commit -m "Added pyqtgraph to project repository"

有关更多信息,请参阅 git subtree 文档。

四、安装

  • 根据您的需要,有许多不同的方式来安装pyqtgraph:
$ pip install pyqtgraph

       有些用户可能需要调用pip3。 这种方法应该适用于所有平台。

 

  • 要访问最新的功能和bug,请从github复制pyqtgraph:  
 $ git clone https://github.com/pyqtgraph/pyqtgraph

       现在你可以从源代码安装pyqtgraph:

  $ python setup.py install

    ..或者你可以简单地把pyqtgraph文件夹放置在可导入的地方,比如在另一个项目的根目录中。 PyQtGraph不需要以任何方式“built”或编译。

  • pyqtgraph的软件包还有其他几种形式:

 

  1.  Anaconda:``conda install pyqtgraph``
  2.  Debian,Ubuntu和类似的Linux:使用 ``apt install python-pyqtgraph``  或下载在pyqtgraph官网网页顶部的.deb文件。
  3.  Arch Linux:安装包(感谢 windel)。(https://aur.archlinux.org/packages.php?ID=62577)
  4.  Windows:在pyqtgraph官网顶部下载.exe安装程序文件。

五、配置

PyQtGraph依赖于:

  • Python 2.7 or Python 3.x
  • A Qt library such as PyQt4, PyQt5, or PySide
  • numpy

满足这些配置的最简单方法是使用pip或像Anaconda这样的科学Python发行版。

后续还会继续更新,敬请期待....

你可能感兴趣的:(GUI编程)