《快速掌握PyQt5》第三十六章 用PyQtGraph绘制可视化数据图表_pyqt graph-程序员宅基地

技术标签: pyqtgraph  qt  PySide  PyQt5  《快速掌握PyQt5》  Python  

第三十六章 用PyQtGraph绘制可视化数据图表

36.1 下载PyQtGraph

36.2 基础知识与用法

36.3 将PyQtGraph嵌入到PyQt5中

36.4 小结


《快速掌握PyQt5》专栏已整理成书出版,书名为《PyQt编程快速上手》,详情请见该链接。感谢大家一直以来的支持!祝大家PyQt用得越来越顺!

如果要用Python来绘制图表的话,我们可能首先会想到用Matplotlib这个库。虽然PyQtGraph还没有像Matplotlib那样成熟,但是当数据量非常大的时候,PyQtGraph的处理速度是Matplotlib所不能比的。而且如果你已经对PyQt5有所了解的话,那PyQtGraph绝对是图表绘制的最佳选择(PyQtGraph是基于Qt和NumPy开发的)。

作为一种强大的绘图库,PyQtGraph在数学、科学和工程领域都有着广泛的应用,那本章我们就来学习下如何使用它。

36.1 下载PyQtGraph

Windows上下载:

pip install pyqtgraph

Linux上下载:

pip3 install pyqtgraph

MacOS上下载:

pip3 install pyqtgraph

下载完毕后我们可以运行以下代码:

import pyqtgraph.examples
pyqtgraph.examples.run()

之后就会显示PyQtGraph库所提供的的一些官方示例(左边为示例名称,右边为代码):

双击左边的任一示例,即可显示相应的界面,比如我们这里双击第二个"Basic Plotting"来显示一个图表合集:

36.2 基础知识与用法

在本小节中,我们会来了解下PyQtGraph中一些基础知识与常见的用法。

全局设置

参数 类型 默认值 解释
leftButtonPan bool True 值为True的话,可以用鼠标左键来上下左右拖动图表;若为False,拖动鼠标左键会形成一个矩形框,视图镜头会随之深入
foreground 参考 mkColor() ‘d’ 设置前景颜色(包括文本、线条、坐标轴等),'d'为灰色
background 参考 mkColor() ‘k’ 设置背景颜色,'k'为黑色
antialias bool False 是否启用抗锯齿(可以让曲线更加光滑)
useOpenGL bool False 是否在视图中启用OpenGL
crashWarning bool False 则会打印针对可能导致程序崩溃情况的警告

PyQtGraph提供了两种类似的方法来进行全局设置:

pyqtgraph.setConfigOptions(**opts) # 同时设置多项参数
pyqtgraph.getConfigOption(opt)     # 只设置一项参数

我们可以这么使用:

# 禁止拖动图表,并启用抗锯齿
pyqtgraph.setConfigOptions(leftButtonPan=False, antialias=True) 

# 禁止拖动图表
pyqtgraph.getConfigOption('leftButtonPan', True)

pyqtgraph.plot()和PlotWidget.plot()

以上两个方法都是用来绘图的,区别如下:

pyqtgraph.plot() 在一个新窗口中绘制数据(窗口中包含一个plotWidget)
PlotWidget.plot() 在plotWidget控件中绘制数据

可见,如果要将PyQtGraph嵌入PyQt5窗口中的话(也就是将控件添加到窗口中),应该使用PlotWidget.plot()。

plot()方法的基本参数如下:

  • x - X轴数据(可选)。如果没有赋值的话,程序则自动生成特定范围的整数值
  • y - Y轴数据
  • pen - 图表线条的画笔参数,若设为None则不显示线条
  • symbol - 参数为字符串类型,用于描述图表每个坐标点的形状。比如设为'o',则坐标点的形状就为o。可选值总共有这么几种:'o', 's', 't', 't1', 't2', 't3','d', '+', 'x', 'p', 'h', 'star'
  • symbolPen - 描绘符号轮廓的画笔参数
  • symbolBrush - 填充符号的画刷参数
  • fillLevel - 用于计算曲线下面积的Y坐标值
  • brush - 用于填充曲线下面积的画刷

示例代码:

# 指定y坐标轴上的值,线条画笔为红色,坐标点符号为'o'
PlotWidget.plot([1, 2, 3, 4, 5], pen='r', symbol='o')

运行截图(可以看到x轴坐标是自动生成的):

颜色,画笔和画刷

PyQt5提供了QColor,QPen和QBrush类用于描绘线条与填充颜色,而在PyQtGraph中,我们可以使用mkColor(),mkPen()以及mkBrush()方法来实例化相应的对象。

我们可以给传参给mkColor()方法来实例化一个QColor颜色对象,可传参数类型有:

‘c’ r, g, b, c, m, y, k, w中的一种
R, G, B, [A] 整数0-255
(R, G, B, [A]) 整数元组0-255
float 灰度值0.0-1.0
“RGB” 十六进制字符串,可以在前面加#
“RGBA” 同上
“RRGGBB” 同上
“RRGGBBAA” 同上
QColor QColor实例

第一行中的单个字符串所对应的值如下:

'b': QtGui.QColor(0,0,255,255)
'g': QtGui.QColor(0,255,0,255)
'r': QtGui.QColor(255,0,0,255)
'c': QtGui.QColor(0,255,255,255)
'm': QtGui.QColor(255,0,255,255)
'y': QtGui.QColor(255,255,0,255)
'k': QtGui.QColor(0,0,0,255)
'w': QtGui.QColor(255,255,255,255)
'd': QtGui.QColor(150,150,150,255)
'l': QtGui.QColor(200,200,200,255)
's': QtGui.QColor(100,100,150,255)

颜色对象主要用于画笔和画刷,而这两者的设置非常简单:

mkPen('r')
mkPen(255, 255, 255)
mkPen((255, 255, 255, 255))
mkPen('#0000FF')
mkPen(QColor)

准确来说,能被mkColor()接受的参数都能用在mkPen()中。除了颜色我们还可以设置画笔粗细:

mkPen(color='r', width=2)
mkPen({'color': '#0000FF', width: 2})

如果不想设置画笔,我们可以传入None:

mkPen(None)

画刷设置同理,可以接受所有能被mkColor()接受的参数。可传入None不设置画刷。

36.3 将PyQtGraph嵌入到PyQt5中

将PyQtGraph所绘制的图表和PyQt5结合是最终目的,请看下方代码:

import sys
import random
import numpy as np
import pyqtgraph as pg
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout


class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.resize(600, 600)

        # 1
        pg.setConfigOptions(leftButtonPan=False)
        pg.setConfigOption('background', 'w')
        pg.setConfigOption('foreground', 'k')

        # 2
        x = np.random.normal(size=1000)
        y = np.random.normal(size=1000)
        r_symbol = random.choice(['o', 's', 't', 't1', 't2', 't3','d', '+', 'x', 'p', 'h', 'star'])
        r_color = random.choice(['b', 'g', 'r', 'c', 'm', 'y', 'k', 'd', 'l', 's'])

        # 3
        self.pw = pg.PlotWidget(self)
        self.plot_data = self.pw.plot(x, y, pen=None, symbol=r_symbol, symbolBrush=r_color)

        # 4
        self.plot_btn = QPushButton('Replot', self)
        self.plot_btn.clicked.connect(self.plot_slot)

        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.pw)
        self.v_layout.addWidget(self.plot_btn)
        self.setLayout(self.v_layout)

    def plot_slot(self):
        x = np.random.normal(size=1000)
        y = np.random.normal(size=1000)
        r_symbol = random.choice(['o', 's', 't', 't1', 't2', 't3', 'd', '+', 'x', 'p', 'h', 'star'])
        r_color = random.choice(['b', 'g', 'r', 'c', 'm', 'y', 'k', 'd', 'l', 's'])
        self.plot_data.setData(x, y, pen=None, symbol=r_symbol, symbolBrush=r_color)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

1. 进行全局设置:禁止拖动、前景色为黑色、背景色为白色;

2. 利用NumPy库生成高斯分布的概率密度随机数作为x轴和y轴坐标数据,并随机挑选符号以及颜色;

3. 实例化一个PlotWidget对象并绘制图表:无画笔、坐标点符号为'o'、符号画刷颜色为绿色。返回一个PlotDataItem对象存储在self.new_plot变量中(该对象就是图表上的数据整体);

4. 按钮用于重新绘制数据,在槽函数中调用setData()方法重新设置数据(如果我们在槽函数中调用self.pw.plot()的话,那新数据就会被重叠绘制到旧数据上)。

运行截图如下:

点击按钮重绘(数据,颜色和符号都改变):

用鼠标左键在指定位置拖出一个矩形对数据深入观察:

如果想要导出图像的话,我们可以点击右键,选择export,之后就会出现一个导出选项框:

我们可以选择导出为图片、SVG文件、CSV文件或者重新在Matplotlib中进行绘制。选择导出格式后,我们可以在Export options框中进行相应的设置(笔者这里就直接选择导出为png格式的图片了),设置好后点击Export按钮则会出现一个文件保存对话框:

点击Save按钮保存图片,此时可能会出现以下报错:

报错显示在ImageExporter.py文件中的第70行,我们根据报错内容直接将这行代码修改如下(将float类型转换为int类型):

bg = np.empty((int(self.params['width']), int(self.params['height']), 4), dtype=np.ubyte)

现在已经可以成功导出:

36.4 小结

1. 从官方示例可以看出,PyQtGraph中内置一些Qt模块,所以如果功能不是非常复杂的话,可以单单使用PyQtGraph实现。可以在这里看到PyQtGraph提供的一些控件;

2. 大家可以自己尝试写一个跟股票相关的软件,其中用爬虫爬取数据,用PyQtGraph做K线图;

3. 如果读者想要显示3D图像的话,笔者建议可以使用PyOpenGL这个库来搭配PyQt5中的QGLWidget;

4. 如果要了解更多关于PyQtGraph的内容,大家可以通过它的官方文档来进一步学习。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/La_vie_est_belle/article/details/90057945

智能推荐

Swift关键词整理_swift test func throws-程序员宅基地

文章浏览阅读141次。AnyObject 、Any、 AnyClass;as、 as?、 as! ;try try?、 try! 的区别一,AnyObject, AnyAnyObjet 代表任何Class类型实例对象,相当于OC中的idpublic typealias AnyObject// The protocol to which all class types implicitly conform. 只适用于class类型eg1:typealias Complicate = (AnyObject) ->_swift test func throws

Spring Security教程(14)---- Logout和SessionManager_spring security authenticationmanager logout-程序员宅基地

文章浏览阅读2.2k次。Logout的配置很简单,只需要在http中加入下面的配置就可以了[html] view plaincopysec:logout invalidate-session="true" logout-url="/logout" logout-success-url="/login.jsp" /> invalidate-session是否销毁Session_spring security authenticationmanager logout

sql判断记录是否属于一个区间(起点-终点)_sql 根据输入的值 查询是否在开始和结束值范围-程序员宅基地

文章浏览阅读4.5k次,点赞3次,收藏3次。遇到这么一个小问题,根据录入的起点数值和终点数值到数据库查看录入的这个区间在数据库中是不是存在,这个问题其实就是一个逻辑判断,但是当时一下子没像清楚。画个图看一下就明白了下面我用图表示下:其中红色表示数据库中的值,黑色表示输入的值,下面“起点”用qd表示,“终点”用zd表示,“输起”用sq表示,“输终”用sz表示。首先第一种情况他的sql我们经常写,qd <= sq和zd>..._sql 根据输入的值 查询是否在开始和结束值范围

spark之DataFrame分析日志文件_dataframe show 生成了日志文件-程序员宅基地

文章浏览阅读3.2k次。场景:我们利用DataFrame对日志中出现的错误次数进行一个统计。 一,准备日志文件: 我这里是使用的hadoop的日志文件,因为以前配置文件没有配好,所有每次启动hadoop会有错误的信息,记录在日志文件。二,书写流程: 1,读取日志文件,将文件转化成RDD。 2,将日志文件通过map函数将数据转化行的格式返回。 3,创建元类型, 即创建schema,为RDD转_dataframe show 生成了日志文件

名称:51单片机之数码管显示实验-程序员宅基地

文章浏览阅读3.8k次,点赞4次,收藏22次。/* 名称:51单片机之数码管显示实验 说明:对于数码管来说,其本质上可以理解为按照一定规则组合的多个二极管。其使用只需按照特定规则显示对应的二极管即可。要稍微注意一点的就是多个数码管的显示分为静态显示和动态显示。静态显示就是每个二极管显示的内容是一样的,通过片选信号来决定是哪个二极管该显示。动态数码管,即利用人眼的视觉停留效果,快速扫描,快速显示每个数码管的内容,使得每个数码...

matlab中用公式求pi值,matlab用π 4公式求π的近似值,直到某一项的绝对值小于10-6为止...-程序员宅基地

文章浏览阅读4.7k次。求问matlab计算的几个公式以及方法.峰值max峭度应该就是梯度了gradient曲线画图:plot(二维)plot3(三维),其他画图都用这个就够了查matlab文档求matlab高手,这个公式用simulink怎么表示问题是你t是整数么?如果整数简单的传递函数环节就能表达出来请教如何用matlab求拟合的公式,就是我知道一组数据,用matlab拟合曲线后,怎么知道这个曲线的方程使用polyf..._matlab求π÷4的近似值

随便推点

TFS2013 附件大小限制修改_tfs 设置git 上传文件大小-程序员宅基地

文章浏览阅读1.2k次。默认只能上传4M大小附件1.使用管理员账户登录应用层服务器 打开 http://localhost:8080/tfs/defaultcollection/WorkItemTracking/v1.0/ConfigurationSettingsService.asmx2.调用 GetMaxAttachmentSize 查看当前附件大小3. 调用 SetMaxAtta_tfs 设置git 上传文件大小

二进制部署K8s群集+Openebs+KubeSphere+Ceph群集_kubesphere openebs-程序员宅基地

文章浏览阅读2.2w次,点赞2次,收藏6次。二进制K8s集群部署——版本为v1.20.4https://www.cnblogs.com/lizexiong/p/14882419.html主机名IP地址组件系统配置k8smaster1192.168.10.101docker、etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kube-proxy、nginx、keepalivedCentos7.92C/2Gk8smaster2_kubesphere openebs

Swift -《从0到1 - 3》:swift通用项目框架搭建(nav+tabbar)_swift项目-程序员宅基地

文章浏览阅读3.3k次,点赞6次,收藏9次。基于Xcode13.x,swift5.x,以后会在此项目基础上进行完善这篇文章介绍怎么改造一个swift默认项目,搭建一个swift通用项目框架,基于nav+tabbar,调整项目结构和层级关系,创建基类(BaseViewController、BaseNavigationController、BaseTabBarController),使用swift分类(extension)和引用oc文件GitHub Demo 地址swift基础教程默认项目创建和分类使用:Swift -《从零开始1》:创._swift项目

实现进程隐藏(完整源代码)_进程隐藏代码-程序员宅基地

文章浏览阅读2.6k次。Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4

80c51简易计算器汇编语言,毕业论文基于80C51的简易计算器.doc-程序员宅基地

文章浏览阅读714次。毕业设计设计题目:基于80C51的简易计算器设计系别: 电气学院专业: 应用电子技术班级: 电子1547班姓名: 苏丹丹学号: 1230302154705指导教师: 储海燕(共 28 页)2015年 04 月 23 日摘? 要随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。电子产品的更新速度快就不足惊奇了,?单片机的应用已经越来越贴近生活..._计算机简单计算器论文

【AI视野·今日Sound 声学论文速览 第二十一期】Mon, 9 Oct 2023-程序员宅基地

文章浏览阅读145次。虽然已经开发了几种用于语音合成检测的深度学习模型,但大多数模型的通用性很差,特别是当攻击具有与所看到的统计分布不同的统计分布时。实验结果表明,我们的方法在大多数任务中实现了与基线相当或更好的性能,包括自动语音识别和八个 SUPERB 任务中的五个。本文进行了首次研究,揭示了现实生活中的声学场景与最相关的 AE 的语义嵌入之间的关系。在现实生活中的 ASC 数据集上进行的实验表明,所提出的 ERGL 通过仅​​学习有限数量的 AE 的嵌入,在 ASC 上实现了有竞争力的性能。