一、pyqtgraph和matplotlib、pyqwt5的比较
使用python做数据分析时,经常会根据数据出图更直观点,目前绘图最常用的几个库:pyqtgraph、Matplotlib、pyqwt5
matplotlib:对于绘图,pyqtgraph并不像matplotlib那样完整/成熟,但运行速度要快得多。Matplotlib更旨在制作具有出版质量的图形,而pyqtgraph则旨在用于数据采集和分析应用。矩阵对于矩阵实验室程序员来说更直观;对于python/qt程序员来说,pyqtgraph更直观。Matplotlib(据我所知)不包括pyqtgraph的许多功能,例如图像交互,体积渲染,参数树,流程图等。
pyqwt5:大约和pyqtgraph一样快,但对于绘图功能来说并不那么完整。pyqtgraph中的图像处理要完整得多(同样,qwt中没有ROI小部件)。此外,pyqtgraph是用纯python编写的,因此它比pyqwt更便携,pyqwt在开发中经常落后于pyqt(我最初使用pyqwt,但决定在我的项目中依赖它作为依赖项太麻烦了)。像matplotlib一样,pyqwt(据我所知)不包括pyqtgraph的许多功能,例如图像交互,体积渲染,参数树,流程图等。
由此可见,pyqtgraph更符合我的应用场景,所以我选择了pyqtgraph库。
二、pyqtgraph简介
2.1什么是pyqtgraph
PyQtGraph被大量应用于Qt GUI平台(通过PyQt或PySide),因为它的高性能图形和numpy可用于大量数据处理。 特别注意的是,pyqtgraph使用了Qt的GraphicsView框架,它本身是一个功能强大的图形系统; 我们将最优化和简化的语句应用到这个框架中,以最小的工作量实现数据可视化。
2.2pyqtgraph可以做什么?
- 基本的2D交互视图中框绘制
- 线和散点图
- 数据可平移/缩放鼠标
- 实时数据的显示和交互的快速绘制
- 图像显示与互动的查找表和电平控制
- 显示所有数据类型(int或float;任何比特深度;RGB,RGBA,或亮度)
- 切片的多维图像任意角度的函数
- 快速更新的视频显示和实时交互
- 三维图形系统(需要Python OpenGL绑定)
- 体积数据的渲染
- 三维表面和散点图
- 网格的等值面生成渲染
- 交互式视口旋转/缩放鼠标
- 更容易编程的基本的3D场景图
- 数据选择/标记和感兴趣的控制区
- 交互标记垂直/水平的地块的位置和区域
- 从图像中选择任意区域的部件和自动切片数据匹配
2.3快速上手
前几天都是百度pyqtgraph绘图的例子,其实官方带了很多,查看起来也非常方便,新手可以花半天时间把这些demo运行一遍看下效果,代码走读一下。
import pyqtgraph.examples
pyqtgraph.examples.run()
运行起来如下:
官方网址:https://www.pyqtgraph.org/
三、怎样使用pyqtgraph
这里有几个建议使用pyqtgraph的方法:
- 从交互式shell(python -i,ipython等)
- 应用程序中显示窗口
- 将小部件嵌入到PyQt应用程序中
3.1 使用命令行
PyQtGraph使得从命令行可视化数据变得非常容易。注意:
这个例子就是告诉你有两个主要的函数:pg.plot,pg.image。一个画曲线,一个画图像。
import numpy as np
import pyqtgraph as pg
data = np.random.normal(size=1000)
pg.plot(data, title="Simplest possible plotting example")# data can be a list of values or a numpy array
data = np.random.normal(size=(500,500))
pg.image(data, title="Simplest possible image example")# data can be a list of values or a numpy array
## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
import sys
if sys.flags.interactive != 1 or not hasattr(QtCore, 'PYQT_VERSION'):
pg.QtGui.QApplication.exec_()
运行结果:
3.2 在应用程序中显示窗口
虽然我认为这种方法有些懒惰,但“懒惰”往往与“高效”无法区分。 这里的方法很简单,就是使用与命令行相同的功能,但是在现有的应用程序中使用。 当我只是想立即获得关于应用程序中数据状态的反馈时,我经常使用它,而无需花时间为其构建用户界面。
3.3 在PyQt应用程序中嵌入小部件
对于认真的应用程序开发人员来说,pyqtgraph中的所有功能都可以通过像其他任何Qt小部件一样嵌入来使用。 更多的重要信息,请参阅:lotWidget,ImageView,GraphicsLayoutWidget和GraphicsView。 PyQtGraph的小部件可以通过“Promote To …”功能包含在Designer的ui文件中:
-
Designer中,创建一个QGraphicsView小部件(“Graphics View”类别下的“Display Widgets”)。
-
用鼠标右键单击QGraphicsView并选择““Promote To…”。
-
在“Promoted calss name”下,输入您希望使用的类名称(“PlotWidget”,“GraphicsLayoutWidget”等)。
-
在“Header file”下,输入“pyqtgraph”。
-
点击“Add”,然后点击“Promote”。
四、在pyqtgraph中绘图
4.1 在pyqtgraph中绘制数据有几种基本的方法
方法 描述
pyqtgraph.plot() 创建一个显示数据的新图形窗口
方法 | 描述 |
---|---|
pyqtgraph.plot() | 创建一个显示数据的新图形窗口 |
PlotWidget.plot() | 将一组新数据添加到现有的绘图小部件 |
PlotItem.plot() | 将一组新数据添加到现有的绘图小部件 |
GraphicsLayout.addPlot() | 在网格中添加一个新的图形 |
所有这些方法都接收相同的基本参数,这些参数控制如何绘制数据和显示图形:
- x - 可选的X数据; 如果未指定,则会自动生成一系列整数。
- y - Y数据。
- pen - 绘制绘图线时使用的笔,或者无以禁用线。
- symbol - 描述用于每个点的符号形状的字符串。 可选地,这也可以是对于每个点具有不同符号的字符串序列。
- symbolPen - 绘制符号轮廓时使用的笔(或笔序列)。
- symbolBrush - 填充符号时使用的画笔(或画笔序列)。
- fillLevel - 填充曲线下面的区域为该Y值。
- brush - 填充曲线时使用的笔刷。
详细可参阅:https://pyqtgraph.readthedocs.io/en/latest/getting_started/plotting.html
4.2 常用的绘图类
显示绘图数据时有几种类型。 大多数这些类都是自动实例化的,但了解它们是如何组织和相互关联是非常有用的。 PyQtGraph很大程度上基于Qt的GraphicsView框架 - 如果您还不熟悉这一点,那么值得一读(但不是必需的)。 最重要的是:1)Qt GUI由QWidgets组成,2)称为QGraphicsView的特殊小部件用于显示复杂图形,3)QGraphicsItems定义在QGraphicsView中显示的对象。
-
数据类(QGraphicsItem的所有子类)
PlotCurveItem - 显示给定x,y数据的绘图线
ScatterPlotItem - 显示给定x,y数据的点
PlotDataItem - 组合PlotCurveItem和ScatterPlotItem。上面讨论的绘图函数创建了这种类型的对象。 -
容器类(QGraphicsItem的子类;包含其他QGraphicsItem对象,必须从GraphicsView中查看)
PlotItem - 包含用于显示数据的ViewBox以及用于显示轴和标题的AxisItems和标签。这是一个QGraphicsItem子类,因此只能在csView中使用
GraphicsLayout - 显示项目网格的QGraphicsItem子类。 这用于一起显示多个PlotItem。
ViewBox - 一个用于显示数据的QGraphicsItem子类。 用户可以使用鼠标缩放/平移ViewBox的内容。 通常,所有PlotData / rve / ScatterPlotItems都是在ViewBox中显示的。
AxisItem - 显示轴值,刻度和标签。 最常用于PlotItem。 -
容器类(QWidget的子类;可能嵌入在PyQt GUI中)
PlotWidget - 显示一个PlotItem的GraphicsView的子类。 PlotItem提供的大多数方法也可以通过PlotWidget获得。
GraphicsLayoutWidget - 显示单个GraphicsLayoutItem的QWidget子类。 GraphicsLayoutItem提供的大多数方法也可以通过csLayoutWidget获得。
也可以通过PlotWidget获得。
GraphicsLayoutWidget - 显示单个GraphicsLayoutItem的QWidget子类。 GraphicsLayoutItem提供的大多数方法也可以通过csLayoutWidget获得。
先这么多吧,还有很多需要以后慢慢学习