目前主要实现效果:
窗体ui草稿:设计排版、图表插入、QWidget提升。
功能:设置计时器,随时间更新频域上的瀑布图。

QCustomPlot2是导师推荐的一款作图软件,相比之前用的matplotlib.pyplot更复杂一点,但是功能也更加多样化,据说作图速度也更快(未测试)。由于QCustomPlot2并不是PyQt5自带的,首先需要用pip安装一下。

安装前先要安装 pyqt5 和 pyqt5-tools(非常重要必须安装)

pip install pyqt5
pip install pyqt5-tools
pip install qcustomplot2

目前效果展示:

上面那张空白的图计划绘制成折线图。现在在点击单次调试后会在下图增加一行,点击开始采集后将自动以0.2s为间隔增加新数据。为测试图标功能性,现在暂时使用随机数据作为输入数据(所以瀑布图上看起来都是噪声)。

下面是源代码:

# mainWindow.py
import math
import sys
import time
from random import randint, randomimport numpy as npfrom matplotlib import pyplot as plt
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QDateTime, QObject, Qt, QThread, pyqtSignal, QTimer
from PyQt5.QtGui import QBrush, QColor, QPen
from PyQt5.QtWidgets import (QApplication, QDialog, QLabel, QLineEdit,QMainWindow, QVBoxLayout, QWidget)from QCustomPlot2 import *from ui.upchart import Ui_Form      # 使用QtDesigner将ui转为py文件,从外部导入作为界面class MainWidow(QMainWindow, Ui_Form):def __init__(self):super(MainWidow, self).__init__()self.setupUi(self)          # setupUi方法写在Ui_Form类中self.pushButton.clicked.connect(self.waveplot)self.pushButton_2.clicked.connect(self.waterfall)self.timer = QTimer()       # 定义计时器self.timer.timeout.connect(self.waterfall)self.is_running = Falseself.log_value = []'''方法实现区'''def waveplot(self):if self.is_running:self.timer.stop()self.is_running = Falseelse:self.timer.start(200)self.is_running = Truedef waterfall(self):customPlot = self.fallchartself.colorMap = QCPColorMap(customPlot.xAxis, customPlot.yAxis)self.colorMap.data().setSize(200, 50)self.colorMap.data().setRange(QCPRange(0, 1024), QCPRange(0, 100))self.log_value.insert(0, np.random.randint(0, 255, 200))   # 随即生成新的随机向量模拟新到来数据if len(self.log_value) > 50:# 只缓存最新的50条数据self.log_value.pop()for i in range(len(self.log_value)):row_vec = self.log_value[i]for j in range(row_vec.size):self.colorMap.data().setCell(j, 49-i, row_vec[j])  # 根据生成的数据,逐个单元调整颜色深度self.colorMap.rescaleDataRange(True)customPlot.rescaleAxes()customPlot.replot()if __name__ == "__main__":import sysapp = QApplication(sys.argv)form = MainWidow()form.show()sys.exit(app.exec_())

另外,ui文件就不上传了,直接上传经过pyuic5转为的py文件,源码如下:
(注意,其中两个用于绘图的QWidget窗口提升为了QCustomPlot2 中的QCustomPlot)

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'test.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from QCustomPlot2 import QCustomPlot
from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(1283, 889)Form.setAutoFillBackground(True)self.label = QtWidgets.QLabel(Form)self.label.setEnabled(True)self.label.setGeometry(QtCore.QRect(460, 100, 496, 36))font = QtGui.QFont()font.setFamily("Consolas")font.setPointSize(18)font.setBold(True)font.setWeight(75)self.label.setFont(font)self.label.setAlignment(QtCore.Qt.AlignCenter)self.label.setObjectName("label")self.log = QtWidgets.QLabel(Form)self.log.setGeometry(QtCore.QRect(210, 60, 151, 151))self.log.setText("")self.log.setPixmap(QtGui.QPixmap("F:/图片/保存的图片/科大校徽1.jpg"))self.log.setScaledContents(True)self.log.setAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignHCenter)self.log.setObjectName("log")self.layoutWidget = QtWidgets.QWidget(Form)self.layoutWidget.setGeometry(QtCore.QRect(460, 220, 511, 541))self.layoutWidget.setObjectName("layoutWidget")self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)self.verticalLayout.setContentsMargins(0, 0, 0, 0)self.verticalLayout.setObjectName("verticalLayout")self.linechart = QCustomPlot(self.layoutWidget)self.linechart.setObjectName("linechart")self.verticalLayout.addWidget(self.linechart)self.fallchart = QCustomPlot(self.layoutWidget)self.fallchart.setObjectName("fallchart")self.verticalLayout.addWidget(self.fallchart)self.pushButton = QtWidgets.QPushButton(Form)self.pushButton.setGeometry(QtCore.QRect(230, 360, 93, 31))self.pushButton.setObjectName("pushButton")self.pushButton_2 = QtWidgets.QPushButton(Form)self.pushButton_2.setGeometry(QtCore.QRect(230, 300, 93, 28))self.pushButton_2.setObjectName("pushButton_2")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.label.setText(_translate("Form", "Deep Learning Signal Classifier"))self.pushButton.setText(_translate("Form", "开始采集"))self.pushButton_2.setText(_translate("Form", "单次调试"))

总结:

其实上面那些都是我踩了不少坑以后写出来的。由于我一开始代码写得不规范,并不符合pyqt5和qtdesigner的设计逻辑,所以在修改代码,希望它能由静态瀑布图到动态瀑布图的过程中,踩了无数的坑。

按照pyqt5的设计逻辑,ui转为的py文件理论上不应该对其做任何修改就可以直接使用。
所有外部窗口的设计都应作为继承相应ui,在此基础上增加新的功能函数。
在设计槽和信号的时候,一定要注意传入方法、类和self的区别。

之后会继续完善功能,预计添加完整的绘图界面。

注:有同学安装后发现无法导入 QCustomPlot2。报错是
DLL load failed while importing QCustomPlot2。 这是因为没有导入PyQt5 包。必须在调用 QCustomPlot2 前调用 PyQt5。解决方法也很简单,先 import PyQt5 即可。
notebook 验证如下:

原因是 QCustomPlot2 是完全依赖于 PyQt5。然而,在由 ui 生成的界面中 pyqt5导入在 QCustomPlot2 之后。说实话这个设计真糟糕。

PyQt5 使用QCustomPlot2动态绘制频谱瀑布图(一)相关推荐

  1. 在Vue中使用WebSocket+HighCharts+Canvas实现高性能的频谱瀑布图

    作者:codexu 废话不多说,先上成品图: 再来个迷你动图: 可能很多同学不知道频谱图和瀑布图,其实我也不懂-但是咱们前端就是负责把数据按照规则显示出来就好(上方折线图为频谱图,下方那一坨为瀑布图) ...

  2. 在vue中利用highcharts+colormap+canvas实现频谱瀑布图

    先看一下实现效果图 1.频谱图是利用highcharts编写的,因为渲染频繁问题,之前也用echarts但发现很消耗内存,所以选择了hightcharts,当前测试的用的是30ms渲染一次,基本不存在 ...

  3. Canvas实现高性能的频谱瀑布图音频频谱图

    看看效果图 技术选型 数据传输:WebSocket 瀑布图:Canvas 为什么使用 WebSocket ? 因为需要服务器实时传输数据,要求达到30帧,每帧动画由 1024 个点组成,肯定要比 Aj ...

  4. qcustomplot绘制热力图瀑布图_使用REmap绘制中国地图

    上次我们介绍了使用ggplot2绘制中国热力地图,需要温习的同学可以点击以下链接 使用ggplot2绘制中国地图  .在使用ggplot2绘制的时候,需要进行数据处理的步骤比较多,今天我们介绍一个新的 ...

  5. 利用QCustomePlot绘制热力图,瀑布图,频谱色图等

    有一个问题l困扰了我很多天,就是如何在QT中实现跟MATALB中imagesc函数一样能够根据二维数组存储的数据的大小自动绘制不同颜色的图形,就如下图所示的瀑布图. 由于自己是边学边做,没有经过系统学 ...

  6. 简介+原理+绘制,详解 Python「瀑布图」的整个制作流程!

    作者|黄伟呢 来源|数据分析与统计学之美 简介 瀑布图,由麦肯锡顾问公司所独创的图表类型,因为形似瀑布流水,所以被大家称之为瀑布图(Waterfall Plot),在企业经营分析.财务分析中使用较多, ...

  7. 瀑布图使用方法及案例详解

    柱状图是我们日常生活中应用最广泛的图表之一,易用性和实用性都很强.然而每天面对这些条条柱柱,难免会有点审美疲劳.别着急,瀑布图将是一个又实用又"高大上"的选择!也许你对这个名字倍感 ...

  8. qcustomplot绘制实时波形图(频谱图、瀑布图、星座图)并开启opengl支持

    先简单介绍一下,绘制实时数据波形图,我们一般使用到的库有qwt.qcustomplot以及官方的QtCharts模块. qwt这个库安装比较麻烦,界面老旧,不过功能比较全. qcustomplot很精 ...

  9. QT 绘制波形图、频谱图、瀑布图、星座图、眼图、语图

    说明 最近在学中频信号处理的一些东西,顺便用 QT 写了一个小工具,可以显示信号的时域波形图.幅度谱.功率谱.二次方谱.四次方谱.八次方谱.瞬时包络.瞬时频率.瞬时相位.非线性瞬时相位.瞬时幅度直方图 ...

最新文章

  1. python字典get计数_python字典中的get方法与setdefault方法
  2. [中英对照]How PCI Works | PCI工作原理
  3. 【转载】BTEs业务交易事件初识
  4. prometheus连续查询_Grafana + Prometheus快速搭建监控平台
  5. 对 makefile 中 $*和静态模式规则结合的学习
  6. IIS 错误代码分析手册
  7. 实时计算Flink 快速入门 —— 步骤二:注册上下游存储
  8. 【转】使用oschina的git服务器
  9. ueditor-图片上传是报错
  10. Excel 4.0宏躲避杀软检测(转)
  11. Jenkins清空当前Clean Workspace
  12. Linux就这个范儿 第10章 生死与共的兄弟
  13. 泰灏咨询的使命及愿景
  14. 【Pygame小游戏】趣味益智游戏 :打地鼠,看一下能打多少只呢?(附源码)
  15. 什么是CDN加速技术?网站用CDN有什么好处
  16. 通灵学院|游戏设计研习10:迭代流程★(2000字)
  17. Android 开发笔记2.0
  18. Java初学者零基础分章学习后续
  19. 【HDU】 4833 Best Financing DP
  20. 无线技术给网络插上飞翔的翅膀(转)

热门文章

  1. 问题ubuntu 和 deepin中 mysql,5.7:ERROR 1698 (28000): Access denied for user 'root'@'localhost'原因与解决
  2. 一文带你了解动态NAT以及NAPT实验配置
  3. GPS星数及有效数确认
  4. IBM MQ 故障诊断(一)
  5. LabVIEW数据类型与数据库数据类型的关系
  6. 赤峰计算机二级考试在哪考,【图】赤峰电脑培训计算机二级考试就到东方—赤峰天下信息网...
  7. word2vec的简单示例
  8. 【mmdetection3d】mmdetection3d安装详细步骤
  9. 区块链笔记:区块链概念、相关对比、技术特点、CAP定理、FLP定理、价值网络
  10. 618直播间里玩起了“排位赛”,按小时刷榜的淘宝直播是如何保持稳定的?