PyQt5的PyQtGraph实践系列1:添加图形到PyQt5布局

1、使用PyQtGraph绘制折线图

在pyqtgraph中,我们可以直接简单快速地绘制一个基本的图形出来。比如下面这样:

import pyqtgraph as pg
import pandas as pd
import sys

# 读取数据
df = pd.read_csv("000001.csv",encoding='gb2312').sort_values("日期")
data = df['收盘价'].tolist()

pg.plot(data,title="A股收盘价历史走势|州的先生zmister.com")
if __name__ == '__main__':
    pg.QtGui.QApplication.exec_()

运行上述代码,我们可以直接得到一个股市收盘价折线图窗口,如下图所示:

这样的图形界面窗口虽然将绘制出了图形来,但是由于是单独的一个窗口,r然而在大多数情况下,我们都是想在PyQt5/PySide2中包含PyQtGraph所生成的图形,但是现在这样的窗口并不方便我们在PyQt5/PiSide2中集成和调用。为了在PyQt5的widget中进行集成,我们需要换一种方式进行调用和绘制。

2、一个基础的PyQt5图形

以下是一个很基础的PyQt5图形界面窗口的代码:

from PyQt5 import QtWidgets
import sys

# 主窗口类
class MainWidget(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("上证指数收盘价历史走势|州的先生zmister.com") # 设置窗口标题
        main_widget = QtWidgets.QWidget() # 实例化一个widget部件
        main_layout = QtWidgets.QGridLayout() # 实例化一个网格布局层
        main_widget.setLayout(main_layout) # 设置主widget部件的布局为网格布局
        self.setCentralWidget(main_widget) # 设置窗口默认部件为主widget

# 运行函数
def main():
    app = QtWidgets.QApplication(sys.argv)
    gui = MainWidget()
    gui.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

在上面的代码中,我们创建了一个派生自QMainWindow类的主窗口,在里面设置的窗口标题、创建了一个空的小部件,并为小部件设置了网格布局。运行上述代码,我们会得到如下图所示的空白图形界面窗口:

大多数使用PyQt5创建的图形界面,都是有着这样的基础结构,可能布局不一样,可能小部件不一样,但是结构式一样的。下面,我们尝试将pyqtgraph的图形添加到PyQt5的窗口部件中。

3、添加pyqtgraph图形到pyqt5小部件

要将pyqtgraph的图形添加到pyqt5的部件中,我们首先要做的就是将pyqtgraph的绘图方式由window改为widget。在《pyqtgraph数据可视化2:使用PyQtGraph绘制图形的6种方法》中,州的先生介绍了pyqtgraph的6中绘图方法,其中的PlotWidget方法就是通过widget方法进行绘图的。

我们修改一下上一节中的代码,将pyqtgraph的绘图代码添加进去,如下图所示:

from PyQt5 import QtWidgets
import pyqtgraph as pg
import pandas as pd
import sys

# 读取数据
df = pd.read_csv("000001.csv",encoding='gb2312').sort_values("日期")
data = df['收盘价'].tolist()

# 主窗口类
class MainWidget(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("上证指数收盘价历史走势|州的先生zmister.com") # 设置窗口标题
        main_widget = QtWidgets.QWidget() # 实例化一个widget部件
        main_layout = QtWidgets.QGridLayout() # 实例化一个网格布局层
        main_widget.setLayout(main_layout) # 设置主widget部件的布局为网格布局
        pw = pg.PlotWidget() # 实例化一个绘图部件
        pw.plot(data, ) # 在绘图部件中绘制折线图
        main_layout.addWidget(pw) # 添加绘图部件到网格布局层
        self.setCentralWidget(main_widget) # 设置窗口默认部件为主widget

# 运行函数
def main():
    app = QtWidgets.QApplication(sys.argv)
    gui = MainWidget()
    gui.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

在此,实例化了一个PlotWidget()类,然后将上证指数的历史数据通过其plot()进行折线绘制,最后将其添加到网格布局中,这样,我们的pyqtgraph图形就集成到了pyqt的窗口中。如下图所示:

4、最后

将pyqtgraph的图形添加到pyqt5窗口只是简单的一小步,之后我们还可以继续对图形进行各种美化和事件处理。后续我们会接着谈到。

本文所使用的数据【上证指数历史数据】后续会经常使用到,其已经上传至百度网盘,链接地址关注州的先生微信公众号(ID:zmister2016),回复关键词0018即可获取。

猜你也喜欢

发表评论

电子邮件地址不会被公开。