最近突发奇想,想要动态展示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) 中进行初始化,否则将无法调用执行。
因为这个极其基础而简单的问题,我被困扰了整整三天,期间查了许多资料,看了大量的代码,才忽然领悟过来。毕竟没有系统而深入地学习过类的相关知识,我都是需要用啥了,才现学现用!
如此一来,不论是实时显示自己绘制的技术指标,还是动态展示回测的过程,都可以一一实现了。
本来想写个保姆级的教程的,但是困了,就这样吧。
需要的自己研究代码,如有问题,可在评论留言。如果有空,我会回复的。

from MyKbreak import *
from MyKlines 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(100)
        
        # 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(0, 100)
        
    
        self.canvas.draw()
        # self.i=self.i+1

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

​
05-14 01:46