PyQt6+pyqtgraph折线图绘制显示

1、实现效果

2、环境:

确认已经安装pyqtgraph的模块,如果没有安装,使用命令安装:

pip install pyqtgraph

3、代码实现:

绘制折线函数:

import sys
import random
from PySide6.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QGraphicsItem
from PySide6.QtCore import Qt, QPointF, QRectF, QTimer
from PySide6.QtGui import QPainter, QPen, QColor, QFontclass ScrollableLineGraph(QGraphicsItem):def __init__(self, data):"""初始化线图项,设置初始显示范围和数据:param data: 要显示的数据列表"""super().__init__()self.data = dataself.current_start = 0  # 当前显示的起始索引self.bounding_rect = QRectF(0, 0, 900, 200)  # 线图的边界矩形def boundingRect(self):"""返回线图的边界矩形,用于确定绘制区域:return: 矩形边界"""return self.bounding_rectdef paint(self, painter, option, widget):"""绘制线图,包括坐标轴、刻度和数据线:param painter: 绘制工具:param option: 绘制选项:param widget: 关联的窗口部件"""painter.setRenderHint(QPainter.Antialiasing)  # 开启抗锯齿axis_pen = QPen(QColor(255, 255, 255))  # 坐标轴线颜色line_pen = QPen(QColor(255, 0, 0))  # 数据线颜色text_font = QFont()  # 字体设置# 绘制x轴painter.setPen(axis_pen)painter.drawLine(0, 200, 900, 200)# 绘制x轴刻度和标签for i in range(0, 20, 1):x = (i - self.current_start) * 45if 0 <= x < 900:painter.drawLine(x, 200, x, 210)painter.drawText(x - 5, 220, str(i + self.current_start))# 绘制y轴painter.drawLine(0, 0, 0, 200)# 绘制y轴刻度和标签for i in range(0, 5):y = 200 - 45 * ipainter.drawLine(-5, y, 0, y)painter.drawText(-20, y - 5, str(i * 20))  #10:表示Y坐标值间隔大小# 绘制y轴刻度和标签,给每个标签添加上横向网格,网格为点状虚线for i in range(0, 5):y = 200 - 45 * i# 网格为点状虚线painter.setPen(QPen(QColor(128, 128, 128), 0.5, Qt.DashLine))# painter.drawLine(-5, y, 0, y)# painter.drawText(-20, y - 5, str(i * 10))painter.drawLine(0, y, 900, y)# 假设已经初始化了painter对象等必要的准备工作# 定义一些常量,提高代码的可读性CANVAS_HEIGHT = 200SCALE_FACTOR = 45LABEL_OFFSET = -20GRID_LINE_WIDTH = 0.5GRID_LINE_COLOR = QColor(128, 128, 128)GRID_LINE_STYLE = Qt.DashLineMAX_LABELS = 10# 新增:封装绘制网格线和刻度标签的函数def draw_scale_and_grid(painter, y_position, label):"""绘制y轴刻度和标签以及对应的横向网格线:param painter: QPainter对象,用于绘制:param y_position: y轴位置:param label: 刻度标签的文本"""try:# 绘制网格线painter.setPen(QPen(GRID_LINE_COLOR, GRID_LINE_WIDTH, GRID_LINE_STYLE))painter.drawLine(-5, y_position, 0, y_position)# 绘制刻度标签painter.drawText(-LABEL_OFFSET, y_position - 5, label)# 绘制右侧网格线painter.drawLine(0, y_position, 900, y_position)except Exception as e:print(f"Error during drawing scale and grid: {e}")# 主绘制逻辑try:for i in range(MAX_LABELS + 1):  # 由于范围是从0到10,因此循环次数应为MAX_LABELS + 1y = CANVAS_HEIGHT - SCALE_FACTOR * i# 检查y位置是否在画布内,若不在则跳过if y < 0:breaklabel = str(i * 10)# draw_scale_and_grid(painter, y, label)except Exception as e:print(f"Unexpected error occurred: {e}")# 假设在这段代码的末尾,有适当的资源释放逻辑,例如painter对象的销毁等# 设置字体painter.setFont(text_font)# 绘制x轴和y轴标签painter.drawText(900, 205, "Time")painter.rotate(-90)painter.drawText(-30,10, "Value")painter.rotate(90)# 绘制数据线painter.setPen(line_pen)painter.setRenderHint(QPainter.SmoothPixmapTransform)last_point = QPointF(0, 200 - self.data[self.current_start])for i in range(self.current_start, min(self.current_start + 50, len(self.data))):x = (i - self.current_start) * 45y = 200 - self.data[i]painter.drawLine(last_point, QPointF(x, y))last_point = QPointF(x, y)

在QT Designer的Widget页面添加Graphics View,命名为graphicsView

在页面类中定义图表初始化和数据更新方法:

  def GraphWidget_uiInit(self):data = []scene = QGraphicsScene(self.graphicsView)self.graphicsView.setScene(scene)self.data_graph = ScrollableLineGraph(data)scene.addItem(self.data_graph)scene.setBackgroundBrushself.graphicsView.setRenderHint(QPainter.Antialiasing)self.graphicsView.setFixedSize(960, 240)self.graphicsView.setSceneRect(0, 0, 900, 220)self.graphicsView.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)# # 设置定时器,用于动态更新数据# self.timer = QTimer(self)# self.timer.timeout.connect(self.update_data)# self.timer.start(60)  # 每500毫秒触发一次def update_data(self):#随机数据# new_data = random.randint(0, 100)# self.data_graph.data.append(new_data)#将字符串数据转换成int类型的列表数据dataStr8 = "100 30 178 100 69 60 98 98 79 50 30 20 29 58 69 39 98 29 32"list_from_string8 = dataStr8.split()number_list8 = list(map(int, list_from_string8))self.data_graph.data = number_list8self.data_graph.current_start = max(0, len(self.data_graph.data) - 50)self.data_graph.update()

参考博文:https://blog.csdn.net/hyd_csdn/article/details/140644014

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Altium Designer学习笔记 1-5 工程创建_元件库创建

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 目录 1、工程组成 2、AD工程创建 3、元件库的阻容模型创建 4、IC类的元件库模型创建 5、排针类的元件库模型创建 1、工程组成 主要包括原理图库----原理图----PCB库----PCB 2、AD工程创建 新建工程项目 …

Video Duplicate Finder 快速识别并去除重复的视频和图像!

文章目录 下载 后续升级 Video Duplicate Finder&#xff08;视频重复查找器&#xff09;是一款开源的跨平台视频&#xff08;以及图像&#xff09;去重软件&#xff0c;通过对比文件内容和特征&#xff0c;快速识别出重复的视频和图像文件&#xff0c;即使是被压缩裁剪过、…

力扣力扣力:860柠檬水找零

860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 需要注意的是&#xff0c;我们一开始是没有任何钱的&#xff0c;也就是说我们需要拿着顾客的钱去找零。如果第一位顾客上来就是要找零那么我们无法完成&#xff0c;只能返回false。 分析&#xff1a; 上来我们先不分…

开源许可协议

何同学推动了开源协议的认识&#xff0c;功不可没&#xff0c;第一次对开源有了清晰的认识&#xff0c;最宽松的MIT开源协议 源自OSC开源社区&#xff1a;何同学使用开源软件“翻车”&#xff0c;都别吵了&#xff01;扯什么违反MIT

装饰器---python

一、柯里化 概念&#xff1a;将原来接受两个参数的函数变成新的接受一个参数的函数过程&#xff0c;新的函数返回一个以原有第二个参数为参数的函数 例如&#xff1a; 例一 原函数是add(x,y),柯里化的目标是add(x)(y),如何实现呢&#xff1f; 相当于嵌套函数&#xff0c;有闭…

Spring AI 框架使用的核心概念

一、模型&#xff08;Model&#xff09; AI 模型是旨在处理和生成信息的算法&#xff0c;通常模仿人类的认知功能。通过从大型数据集中学习模式和见解&#xff0c;这些模型可以做出预测、文本、图像或其他输出&#xff0c;从而增强各个行业的各种应用。 AI 模型有很多种&…

知识见闻 - 数学: 均方根 Root Mean Square

What is Root Mean Square (RMS)? 在统计学上&#xff0c;均方根&#xff08;RMS&#xff09;是均方的平方根&#xff0c;而均方是一组数值的平方的算术平均数。均方根也称为二次均值&#xff0c;是指数为 2 的广义均值的一种特例。均方根也被定义为基于一个周期内瞬时值的平方…

基于Spring AI alibaba组件AI问答功能开发示例

基于Spring AI alibaba组件AI问答功能开发示例 功能效果图&#xff1a; http://localhost:9999/ai/test http://localhost:9999/ai/chat?inputai 配置 application.yaml 指定 API-KEY&#xff08;可通过访问阿里云百炼模型服务平台获取&#xff0c;有免费额度可用。&#x…

Linux - 线程基础

文章目录 1.什么是线程2.线程vs进程3.线程调度4.线程控制4.1 POSIX线程库4.2创建线程4.3线程终止4.4线程等待4.5线程分离 5、线程封装 1.什么是线程 在Linux操作系统中&#xff0c;线程是进程内部的一个执行流。在Linux操作系统下&#xff0c;执行流统称为轻量级进程&#xff0…

5、AI测试辅助-生成测试用例思维导图

AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐&#xff09;2、Markdown思维导图版本&#xff08;推荐&#xff09; 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素&#xff1a; 1、测试模块 2、测试标题 3、前置条件 4、…

PTA编程题:N个数求和

问题描述 思路分析 问题分解 输入处理&#xff1a;将分数拆解为分子和分母&#xff0c;存储并处理。 分数相加规则&#xff1a; 即分子相加、分母相乘。 结果化简&#xff1a;求分数的最大公因数&#xff08;GCD&#xff09;&#xff0c;将其约分至最简形式。 带分数处理&…

Selenium + 数据驱动测试:从入门到实战!

引言 在软件测试中&#xff0c;测试数据的多样性和灵活性对测试覆盖率至关重要。而数据驱动测试&#xff08;Data-Driven Testing&#xff09;通过将测试逻辑与数据分离&#xff0c;极大地提高了测试用例的可维护性和可扩展性。本文将结合Selenium这一流行的测试工具&#xff0…

RK3568平台(中断篇)ARM中断流程

一.ARM 处理器程序运行的过程 ARM芯片属于精简指令集计算机 (RISC: Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点: ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 ③ 使用RISC指令的CPU复杂度小一点,易于设计 比如对于 a=a+b 这…

视频修复技术和实时在线处理

什么是视频修复&#xff1f; 视频修复技术的目标是填补视频中的缺失部分&#xff0c;使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频&#xff0c;导致处理速度慢&#xff0c;难以满足实时处理的需求。 技术发…

推荐一款专业电脑护眼工具:CareUEyes Pro

CareUEyes Pro是一款非常好用的专业电脑护眼工具&#xff0c;软件小巧&#xff0c;界面简单&#xff0c;它可以自动过滤电脑屏幕的蓝光&#xff0c;让屏幕显示更加的不伤眼&#xff0c;更加舒适&#xff0c;有效保护你的眼睛&#xff0c;可以自定义调节屏幕的色调&#xff0c;从…

Element UI 组件库详解【Vue】

文章目录 一、引言二、安装并使用1. 安装2. 使用 三、常见组件说明1. 基础组件2. 布局组件3. 布局容器4. 选择框组件5. 输入框组件6. 下拉框组件7. 日期选择器8. 上传组件9. 表单组件10. 警告组件11. 提示组件12. 表格组件 一、引言 官方网站&#xff0c;element.eleme.cn El…

相机触发模式

参考自&#xff1a;相机触发模式_硬触发和软触发的区别-CSDN博客 一、图像采集模式分类 相机的图像采集模式分为内触发模式与外触发模式。其中内触发模式包含连续采集、单帧采集两种形式&#xff1b;外触发模式包含软件外触发、硬件外触发。本文以海康相机的软件平台作介绍&a…

脚手架vue-cli,webpack模板

先安装node.js&#xff0c;它是服务器端&#xff0c;用于给页面提供服务。前端学习不需要会node.js&#xff0c;只需要学会node.js衍生出来的npm命令即可。 npm 是node.js的一个工具&#xff0c;作用是进行包管理&#xff0c;npm是node.js的包管理器。 接着安装脚手架&#xff…

Stable Diffusion核心网络结构——CLIP Text Encoder

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…

ggplot2 分面图等添加注释文字,相加哪里加哪里: 自定义函数 AddText()

如果分面图上还想再添加文字&#xff0c;只能使用底层的grid包了。 函数定义 # Add text to ggplot2 figures # # param label text you want to put on figure # param x position x, left is 0, right 1 # param y position y, bottom is 0, up 1 # param color text color…