最近突发奇想,想要动态展示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_())