利用PyQt动态展示Matplotlib的绘图(反转图)


最近突发奇想,想要动态展示Matplotlib的绘图。

一直以来,分析期货的数据时,都用的是静态的图片。

其不足之处在于,显示实时的行情时,存在滞后性。

于是想到了使用PyQt设计GUI界面来显示。

于是找了许多的资料,思考了很久很久,终于了成功地弄出来了。

其中的关键在于,把Matplotlib的绘图转为PyQt的控件,然后将其添加到PyQt的布局中。
把Matplotlib的绘图转为PyQt的控件主要使用Matplotlib的FigureCanvasQTAgg类。

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

动态刷新绘图则需要用到PyQt的QTimer类。

from PyQt5.QtCore import QTimer

需要注意的是,类中需要执行的方法(函数),在要在__init__(self) 中进行初始化,包括继承自父类的方法,都要在__init__(self) 中进行初始化,否则将无法调用执行。
包括自定义的绘图函数,也可以在__init__(self)中调用执行。

因为这个极其基础而简单的问题,我被困扰了整整三天,期间查了许多资料,看了大量的代码,才忽然领悟过来。
毕竟没有系统而深入地学习过类的相关知识,我都是需要用啥了,才现学现用!

要实现在PyQt的窗口中显示绘图,主要流程如下:

1将Matplotlib的figure对象转换为Qt的widget对象

self.canvas =FigureCanvas(self.figure)

2创建一个QGraphicsScene对象

self.scene =QGraphicsScene(self)

3将Matplotlib的widget添加到QGraphicsScene中

self.scene.addWidget(self.canvas)

4创建一个QGraphicsView对象,并将QGraphicsScene添加其中

self.view =QGraphicsView(self.scene)

5将QGraphicsView添加到主窗口中

self.setCentralWidget(self.view)

如此一来,不论是实时显示自己绘制的技术指标,还是动态展示回测的过程,都可以一一实现了。
本来想写个保姆级的教程的,但是困了,就这样吧。
需要的自己研究代码,如有问题,可在评论留言。如果有空,我会回复的。

from MyKbreak import *
from 获取掘金数据 import *

import sys
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsScene, QGraphicsView
from PyQt5.QtCore import Qt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtCore import QTimer

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 100, 800, 600)
        self.setWindowTitle('Matplotlib in PyQt5')

        
        self.data = get_data_juejin(symbol="fu2409",
                        start="2024-05-13",
                        end="2024-05-13 23:00:00",
                        frequency="15s",
                        fields="eob,symbol,frequency,open,close,high,low,volume,amount,position",
                        adjust=0)

        print(self.data)  
        self.figure=plt.figure(figsize=(16,9))
        # 获取每个位置的axes对象
        self.axes = self.figure.add_subplot(1,1,1)
        # plt.show()
        # 将Matplotlib的figure对象转换为Qt的widget对象
        self.canvas = FigureCanvas(self.figure)
        
        # 创建一个QGraphicsScene对象
        self.scene = QGraphicsScene(self)
        
        # 将Matplotlib的widget添加到QGraphicsScene中
        self.scene.addWidget(self.canvas)
        
        # 创建一个QGraphicsView对象,并将QGraphicsScene设置为其场景
        self.view = QGraphicsView(self.scene)
        
        # 将QGraphicsView添加到主窗口中
        self.setCentralWidget(self.view)
        
        # 设置定时器,用于更新
        self.timer1 = QTimer(self)
        self.timer1.timeout.connect(self.plot)
        self.timer1.start(500)
        
        self.i =1
        
        

        
    def plot(self):
        self.axes.clear()    
        # 实时行情则使用以下数据
        # data = get_data_juejin(symbol="fu2409",
        #                 start="2024-05-13",
        #                 end="2024-05-13 23:00:00",
        #                 frequency="15s",
        #                 fields="eob,symbol,frequency,open,close,high,low,volume,amount,position",
        #                 adjust=0)

         
        data = self.data[:self.i]   
        
        kbreak(
            ax=self.axes,  #绘图的区域
            data=data,  # 绘图数据,dataframe,包括时间和价格
            n=2,  #反转的柱体
            width=0.5,  # 柱体的宽度
            edgecolor_up='red',  # 上涨的边框颜色
            facecolor_up='white',  # 上涨的填充颜色
            edgecolor_down='green',  # 下跌的边框颜色
            facecolor_down='green',  # 下跌的填充颜色
            count_show=False,  # 是否显示趋势计数
            draw_start=0,  # 为了避免缺失值,从哪一项开始绘制
            grid_show=False,  # 是否显示网格
        )
        self.axes.set_xlim(-1, 100)
        
    
        self.canvas.draw()
        self.i=self.i+1
        print(f'当前进度:{self.i}/{len(self.data)}')

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

-----------------------------------------------------------------------------------------------------------------------------------------------------​-----------------------​
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: PyQt5是一个为python提供形用户界面库,而Matplotlib是一个python 2D绘图库。两者可以结合使用,通过PyQt5创建形用户界面,在界面上使用Matplotlib进行动态绘图。 为了在PyQt5中使用Matplotlib,需要安装PyQt5和Matplotlib包,并使用Matplotlib的pyplot模块和PyQt5的QtWidgets模块。 代码示例如下: ``` from PyQt5 import QtWidgets from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure class MyMplCanvas(FigureCanvas): def __init__(self, parent=None, width=5, height=4, dpi=100): fig = Figure(figsize=(width, height), dpi=dpi) self.axes = fig.add_subplot(111) FigureCanvas.__init__(self, fig) self.setParent(parent) FigureCanvas.setSizePolicy(self, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) FigureCanvas.updateGeometry(self) class MyDynamicMplCanvas(MyMplCanvas): def __init__(self, *args, **kwargs): MyMplCanvas.__init__(self, *args, **kwargs) timer = QtCore.QTimer(self) timer.timeout.connect(self.update_figure) timer.start(1000) def update_figure(self): pass ``` 这个例子中MyDynamicMplCanvas是一个用于动态绘图的类。通过使用QtCore.QTimer,每秒调用update_figure函数。update_figure函数可以被重写以实现具体的绘图操作。 ### 回答2: PyQt5 是一个 Python 编写的形界面开发工具包。而 Matplotlib 是用于 Python 编程语言及其数值数学扩展库 NumPy 的绘图库。它提供了数据绘制、数据可视化等强大的功能,能够生成各种类型的形,并支持动态绘图。 在使用 PyQt5 和 Matplotlib 进行动态绘图时,我们可以通过 PyQt5 的 QTimer 以及 Matplotlib 的 FigureCanvas 实现动态更新形。过程如下: 1. 创建一个带有绘图区域的 PyQt5 窗口,并在窗口中添加 Matplotlib 绘制的形。 2. 初始化 Matplotlib 绘图中的数据,并将数据与形绑定。初始化数据的方法可以通过 Matplotlib 中的 Artist 对象来实现,例如使用 Line2D 对象进行初始化,同时使用 pyplot 对象对绘图进行布局和风格设置。 3. 使用 QTimer 定时器来触发 Matplotlib 动态更新形。在定时器的槽函数中,更新绘图数据并重新绘制 Matplotlib 画布。 因为 PyQt5 和 Matplotlib 本身都是非常强大的工具,因此在动态绘图时,我们也可以通过一系列的操作来优化绘图的效果,比如设置动画效果、优化绘图速度、调整绘图样式等。 总之,PyQt5 和 Matplotlib 都是非常适合进行动态绘图的工具,通过它们,我们可以轻松地实现绘制各种精美动态形的需求。 ### 回答3: pyqt5是Python编程语言的一个GUI(形用户界面)框架,而matplotlib是一个强大的绘图库,这两个库可结合使用,用于动态绘图动态绘图是一种让像在一定时间内进行变换的绘图方式,通过动态绘图,能够展现出数据变化的趋势和规律,因此在数据分析和可视化中使用非常广泛。 在使用pyqt5和matplotlib实现动态绘图时,主要需要进行以下几个步骤: 1. 创建主窗口,设置布局。在pyqt5中,可以创建一个QMainWindow或者QDialog类的窗口作为主窗口,通过设置布局可以将matplotlib绘图区域嵌入到窗口中。 2. 创建matplotlib figure和axes对象。通过创建figure和axes对象,可以绘制各种像,比如折线,条形,散点等。 3. 实时更新绘图数据并重绘图像。通过更新figure和axes对象的数据,可以实现像的实时更新,并将像重绘到绘图区域中。 4. 添加交互功能。在pyqt5中,可以通过添加交互功能,比如按钮、滑动条或者输入框等,来实现对数据的操作,从而实现实时更新绘图数据的目的。 总之,pyqt5和matplotlib结合起来实现动态绘图,不仅能让数据在可视化时更为直观和清晰,也能为用户提供交互功能,使得用户能够更加深入地了解数据所反映的现象,并进行分析和预测。因此,在数据分析和可视化领域,pyqt5和matplotlib动态绘图技术是非常重要的一种技术手段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏悠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值