没时间了,先上效果图,再上代码,最后解析。

import sys
from PyQt5.QtWidgets import QApplication, QWidget ,QGridLayout
#导入matplotlib并使用QT5的底层渲染
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
#导入图形模块
from matplotlib.figure import Figure
class AddMatplotlibToPyqt5():
def __init__(self):
app = QApplication(sys.argv)
#创建一个网格布局的pyqt5窗口
self.creat_pyqt5_window()
#创建一个可以载入pyqt5的matplotlib画布
canvas = self.creat_figure_widget()
#将画布加入窗口的布局中去
self.layout.addWidget(canvas)
#显示窗口
self.window.show()
sys.exit(app.exec_())
def creat_pyqt5_window(self):
self.window = QWidget()
self.layout = QGridLayout()
self.window.setLayout(self.layout)
def creat_figure_widget(self):
# 创建空白图形
fig = Figure()
# 创建空白子图(只含笛卡尔坐标系)
subplot1 = fig.add_subplot(111)
# 在子图subplot1中绘制折线图
subplot1.plot([1, 2, 3], [3, 2, 1])
# 将图框使用FigureCanvas封装,使其可以被pyqt5使用
canvas = FigureCanvas(fig)
return canvas
AddMatplotlibToPyqt5()
pyqt5部分不做详解,只是创建了一个窗口,并且设定窗口为网格布局,最后将经过处理的matplotlib图形作为一个普通的控件放入布局中。要理解程序,就必须要明确Figure,subplot,plot以及canvas的概念。
首先是figure,指的是整个图形(黑框包围部分),可以通过add_subplot创建很多个subplot(译为“子图”,可以简单地理解为创建了一个笛卡尔坐标系),下图为包含两个子图的figure,而plot就是在一个子图中画折线图。

接着是最重要的canvas
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
matplotlib中,frontend就是我们写的python代码,而backend就是负责显示图形的底层代码。在matplotlib.backends中我们可以根据自己的平台而选用不同的底层代码,PyQt5的底层代码是QT5,所以我们需要qt5agg。而FigureCanvasQTAgg(figure)的作用是将图形渲染到画布,使图形可以在PyQt5上显示。
最后,将画布加入到网格中即可。