PyQt6基础_pyqtgraph_折线图with缩放调节

目录

字符型横坐标代码

折线图代码

运行


创建新类,继承pg.PlotWidget,在新类中实现业务内容,重写pg.PlotWidget中的wheelEvent方法并使用业务数据实现比较理想的缩放状态。

字符型横坐标代码

class StrAxisItem(pg.AxisItem):def __init__(self,ticks,*args,**kwargs):pg.AxisItem.__init__(self,*args,**kwargs)self.x_values = [x[0] for x in ticks]self.x_strings = [x[1] for x in ticks]passdef tickStrings(self, values, scale, spacing):strings = []for v in values:vs = v*scaleif vs in self.x_values:vstr = self.x_strings[self.x_values.index(vs)]else:vstr = ''strings.append(vstr)return strings

折线图代码

class LineGraphWidget(pg.PlotWidget):def __init__(self):super().__init__()self.init_data()passdef init_data(self):self.whole_df:pd.DataFrame = pd.DataFrame()self.color_one = (30,144,255)self.color_two = (138,43,226)self.color_three = (220,20,60)passdef set_data(self,df:pd.DataFrame):self.clear()self.addLegend()self.whole_df = dfx = df['x'].to_list()xTicks = df.loc[:, ['x', 'date']].valuesy_dict = {'one': df['one'].to_list(),'two': df['two'].to_list(),'three': df['three'].to_list()}one_curve = pg.PlotCurveItem(x=np.array(x),y=np.array(y_dict['one']),pen=pg.mkPen({'color':self.color_one}),connect='finite',name='one')two_curve = pg.PlotCurveItem(x=np.array(x),y=np.array(y_dict['two']),pen=pg.mkPen({'color':self.color_two}),connect='finite',name='two')three_curve = pg.PlotCurveItem(x=np.array(x),y=np.array(y_dict['three']),pen=pg.mkPen({'color':self.color_three}),connect='finite',name='three')horAxis = StrAxisItem(ticks=xTicks, orientation='bottom')self.setAxisItems({'bottom':horAxis})self.addItem(one_curve)self.addItem(two_curve)self.addItem(three_curve)self.vLine = pg.InfiniteLine(angle=90,movable=False)self.hLine = pg.InfiniteLine(angle=0,movable=False)self.label = pg.TextItem()self.addItem(self.vLine,ignoreBounds=True)self.addItem(self.hLine,ignoreBounds=True)self.addItem(self.label,ignoreBounds=True)self.vb = self.getViewBox()self.proxy = pg.SignalProxy(self.scene().sigMouseMoved, rateLimit=60, slot=self.pw_mouseMoved)self.enableAutoRange()passdef pw_mouseMoved(self, evt):pos = evt[0]if self.sceneBoundingRect().contains(pos):mousePoint = self.vb.mapSceneToView(pos)index = int(mousePoint.x())if index>=0 and index<len(self.whole_df):html_str = ''html_str += f"<br/>日期:{self.whole_df.loc[self.whole_df['x']==index].iloc[0]['date']}"html_str += f"<br/>one:{self.whole_df.loc[self.whole_df['x']==index].iloc[0]['one']}"html_str += f"<br/>two:{self.whole_df.loc[self.whole_df['x']==index].iloc[0]['two']}"html_str += f"<br/>three:{self.whole_df.loc[self.whole_df['x']==index].iloc[0]['three']}"self.label.setHtml(html_str)self.label.setPos(mousePoint.x(),mousePoint.y())passself.vLine.setPos(mousePoint.x())self.hLine.setPos(mousePoint.y())passdef wheelEvent(self,ev):if len(self.whole_df) <= 0:super().wheelEvent(ev)else:delta = ev.angleDelta().x()if delta == 0:delta = ev.angleDelta().y()s = 1.001 ** deltabefore_xmin, before_xmax = self.viewRange()[0]val_x = self.getViewBox().mapSceneToView(ev.position()).x()after_xmin = int(val_x - (val_x - before_xmin) // s)after_xmax = int(val_x + (before_xmax - val_x) // s)if after_xmin < 1:after_xmin = 0if after_xmin >= len(self.whole_df):after_xmin = max(len(self.whole_df) - 3, len(self.whole_df) - 1)if after_xmax < 1:after_xmax = min(len(self.whole_df) - 1, 1)if after_xmax >= len(self.whole_df):after_xmax = len(self.whole_df) - 1# print(after_xmin, after_xmax)df00 = self.whole_df.loc[(self.whole_df['x'] >= after_xmin) & (self.whole_df['x'] <= after_xmax)].copy()after_ymin = min(df00['one'].min(), df00['two'].min(), df00['three'].min())after_ymax = max(df00['one'].max(), df00['two'].max(), df00['three'].max())self.setXRange(after_xmin, after_xmax)self.setYRange(after_ymin, after_ymax)passpass

运行

if __name__ == '__main__':df = pd.DataFrame(data={'date':['2020-01-01','2021-01-01','2022-01-01','2023-01-01','2024-01-01'],'one':[1,5,12,8,3],'two':[-9,2,4,8,-10],'three':[-1,5,8,10,-5]})df['x'] = range(len(df))app = QApplication([])pw = LineGraphWidget()pw.set_data(df.copy())pw.show()app.exec()pass

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

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

相关文章

联邦元学习实现个性化物联网的框架

随着数据安全和隐私保护相关法律法规的出台&#xff0c;需要直接在中央服务器上收集和处理数据的集中式解决方案&#xff0c;对于个性化物联网而言&#xff0c;训练各种特定领域场景的人工智能模型已变得不切实际。基于此&#xff0c;中山大学&#xff0c;南洋理工大学&#xf…

audio 核心服务AudioPolicyService 和AudioFlinger启动流程

目录 1、audioserver启动 2、AudioPolicyService启动 3、AudioFlinger启动 audio的核心服务有两个&#xff0c;AudioPolicyService 和AudioFlinger他们到在audioserver一个进程中 1、audioserver启动 设备开机&#xff0c;系统启动时将执行 /system/etc/init/audioserver.rc…

反爬虫机制中的验证码识别:类型、技术难点与应对策略

在互联网数据抓取领域&#xff0c;验证码识别是爬虫过程中的关键环节之一。下面对常见验证码类型、技术难点及应对策略进行详细解析&#xff0c;并提供多种场景下的代码实现示例。 一、验证码类型与技术难点 &#xff08;一&#xff09;图形验证码 1. 字符验证码 特征&#…

vue element使用el-table时,切换tab,table表格列项发生错位问题

展示问题 问题描述&#xff1a;使用el-table的fixed"right"属性后&#xff0c;如果切换tab时&#xff0c;回出现最后一列错误的问题 官网提供解决方法&#xff1a;doLayout 需要注意的事项&#xff1a;我这里是通过组件使用的table组件&#xff0c;涉及多层组件封装…

示例:Spring JDBC 声明式事务(xml配置形式)

声明式事务是指在不修改源代码的情况下通过配置applicationContext.xml自动实现事务控制&#xff0c;其本质是AOP环绕通知。它的触发时机为&#xff1a;1、当目标方法执行成功时自动提交事务&#xff0c;2、当目标方法抛出运行时异常时&#xff0c;自动事务回滚 核心步骤示例&a…

在vmware中ubuntu系统因为安装了docker查不到ip地址

问题截图&#xff1a; 根据提供的截图信息&#xff0c;可以明确看到ens33网卡处于**物理连接断开&#xff08;NO-CARRIER&#xff09;且接口关闭&#xff08;DOWN&#xff09;**的状态&#xff0c;这是导致无法获取IP地址的直接原因。以下是针对VMware虚拟机的具体解决方案&am…

51c大模型~合集121

我自己的原文哦~ https://blog.51cto.com/whaosoft/13869815 #大模型何以擅长小样本学习&#xff1f; 这项研究给出详细分析 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;在人工智能领域取得了突破性进展&#xff0c;成为推动自然语言处理技术发展与通用人…

Babylon.js 材质统一转换指南:将 AssetContainer 中的所有材质转换为 PBRMetallicRoughnessMaterial

在现代 3D 开发中&#xff0c;基于物理的渲染(PBR)已成为行业标准。本文将详细介绍如何在 Babylon.js 中将 AssetContainer 加载的各种材质统一转换为 PBRMetallicRoughnessMaterial&#xff0c;实现项目材质的标准化。 为什么需要材质转换&#xff1f; PBRMetallicRoughness…

Go slice切片使用教程,一次通关!

简介 Go 中的 切片&#xff08;slice&#xff09; 是 Go 最强大、最常用的数据结构之一。它是对数组的轻量封装&#xff0c;比数组更灵活&#xff0c;几乎所有的集合处理都用切片来完成。 什么是切片&#xff08;slice&#xff09; 切片是一个拥有 长度&#xff08;len&…

nodejs的包管理工具介绍,npm的介绍和安装,npm的初始化包 ,搜索包,下载安装包

nodejs的包管理工具介绍&#xff0c;npm的介绍和安装&#xff0c;npm的初始化包 &#xff0c;搜索包&#xff0c;下载安装包 &#x1f9f0; 一、Node.js 的包管理工具有哪些&#xff1f; 工具简介是否默认特点npmNode.js 官方的包管理工具&#xff08;Node Package Manager&am…

FPGA设计 时空变换

1、时空变换基本概念 1.1、时空概念简介 时钟速度决定完成任务需要的时间&#xff0c;规模的大小决定完成任务所需要的空间&#xff08;资源&#xff09;&#xff0c;因此速度和规模就是FPGA中时间和空间的体现。 如果要提高FPGA的时钟&#xff0c;每个clk内组合逻辑所能做的事…

增加首屏图片

增加首屏图片&#xff08;bg.jpg&#xff09; web-mobile类型打包 //index.html脚本 <div id"myDiv_1111"style"background: url(./bg.jpg) 50% 50%/ 100% auto no-repeat ; width:100%;height:100%;position:absolute;"></div> //游戏内脚本…

贪心算法~~

目录 一、理论基础 二、题目练习 &#xff08;1&#xff09;455. 分发饼干 &#xff08;2&#xff09;53. 最大子数组和 - 力扣 &#xff08;3&#xff09;122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; &#xff08;4&#xff09;860. 柠檬水找零…

形象解释 HTTP 的四种常见请求方式及其中的区别联系

HTTP 的常见请求方式常见的有四种&#xff1a;GET、POST、PUT、DELETE&#xff0c;它们各自的功能不一样。 &#x1f35c; 场景比喻&#xff1a;HTTP 请求像“去餐厅点菜” 请求方式行为餐厅比喻说明GET获取数据看菜单/问服务员&#xff1a;你们有什么菜&#xff1f;不带食材、…

string的基本使用

string的模拟实现 string的基本用法string的遍历&#xff08;三种方式&#xff09;&#xff1a;关于auto&#xff08;自动推导&#xff09;:范围for: 迭代器普通迭代器(可读可改&#xff09;const迭代器&#xff08;可读不可改&#xff09; string细小知识点string的常见接口引…

kubernetes》》k8s》》证书有效期

cd /etc/kubernetes/pki openssl x509 -in apiserver.crt -text -noount通常&#xff0c;Kubernetes的证书是由kubeadm生成的&#xff0c;所以可能需要修改kubeadm的源码或者配置 登录Master节点 》》》默认延续1年 # 查看证书 检查证书有效期 # 该命令显示 /etc/kubernetes…

LangChain LCEL表达式语言简介

LangChain表达式语言&#xff08;LCEL&#xff09;是专为构建AI应用链设计的声明式编程框架&#xff0c;通过管道符|实现组件无缝衔接&#xff0c;支持流式处理、异步调用等生产级特性。其核心优势在于零代码改动实现原型到生产的过渡&#xff0c;同时保持代码简洁性和可维护性…

【计算机视觉】CV实践项目- 基于PaddleSeg的遥感建筑变化检测全解析:从U-Net 3+原理到工程实践

基于PaddleSeg的遥感建筑变化检测全解析&#xff1a;从U-Net 3原理到工程实践 技术背景与项目意义传统方法的局限性深度学习的优势 核心技术与算法原理U-Net 3架构创新全尺度跳跃连接深度监督机制 变化检测技术路线 实战指南&#xff1a;从环境搭建到模型部署环境配置数据准备与…

万字长文 | Apache SeaTunnel 分离集群模式部署 K8s 集群实践

文章作者&#xff1a;雷宝鑫 整理排版&#xff1a;白鲸开源 曾辉 Apache SeaTunnel官网链接: https://seatunnel.apache.org/ Apache SeaTunnel(以下简称SeaTunnel&#xff09;是一款新一代高性能、分布式的数据集成同步工具&#xff0c;正受到业界广泛关注和应用。SeaTunnel支…

深入解析YOLO v1:实时目标检测的开山之作

目录 YOLO v1 算法详解​ ​1. 核心思想​ ​2. 算法优势​ ​3. 网络结构&#xff08;Unified Detection&#xff09;​​ ​4. 关键创新​ ​5. 结构示意图&#xff08;Fig1&#xff09;​ Confidence Score 的计算​ 类别概率与 Bounding Box 的关系​ 后处理&…