在PyQt5设计的GUI界⾯中显⽰matplotlib绘制的图形
⼀、matplotlib如何嵌⼊PyQt5中?
通过matplotlib.backends.backend_qt5agg类连接PyQt5。在实际代码中,我们需要在引⽤部分加⼊内容:
import matplotlib
matplotlib.use("Qt5Agg")  # 声明使⽤QT5
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
⼆、如何使⽤FigureCanvas和Figure类
class matplotlib.figure.Figure(figsize=None, dpi=None,
facecolor=None, edgecolor=None, linewidth=0.0,
tight_layout=None, constrained_layout=None)
例如:
width=5, height=4, dpi=100
self.fig = Figure(figsize=(width, height), dpi=dpi)
其中:width,height,为窗⼝尺⼨,5英⼨*4英⼨,分辨率为dpi=100
另外⼀个函数是:add_subplot(221)
它是⽤来创建⼦图,如图matlab的subplot(2,2,1),表⽰共有4个⼦图,当前为第⼀个⼦图。具体应⽤如下:
sefl.axes = self.fig.add_subplot(221)
然后在self.axes中绘制图形如下:
t = np.arange(0.0, 3.0, 0.01)
s = np.sin(2 * np.pi * t)
self.axes.plot(t, s)
=============================================
上述介绍的是使⽤Figure和subplot如何绘制图形,图形是可以绘制了,但是怎么将其在Gui界⾯控件中显⽰呢?
三、如何将图形显⽰在Gui控件上?
图形:正弦曲线,使⽤Figure实现的self.axes.plot(t, s)
GUi:Widget、Dialog和MainWindow三种窗⼝类型
控件(部件):
1)QTabWidget()部件的页⾯上
2)QGraphicsView图形视图
3)QgroupBox组框控件
4)还有其他可以作为Ui容器的控件都可以
【因为创建的Figure本⾝是⼀个部件,它也是PyQt中的Widget,所以我们只需要将创建的图形添加到GUI界⾯中的容器控件中即可显⽰图形。】
例1 在对话框中添加⼀个Widget中⼼部件,然后再在中⼼部件中添加⼀个GroupBox部件,保存ui⽂件(使⽤Qt designer)。并将其转为.py⽂件,代码如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'testplot2pyqt5.ui'
# Created by: PyQt5 UI code generator 5.10
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setGeometry(QtCore.QRect(370, 470, 341, 32))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)        self.buttonBox.setObjectName("buttonBox")
self.widget = QtWidgets.QWidget(Dialog)
self.widget.setGeometry(QtCore.QRect(10, 10, 691, 451))
self.widget.setObjectName("widget")
matplotlib中subplot
self.t(Dialog.accept)
ject)
tSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = anslate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
下⾯另新建⼀个python⽂件⽤于写主函数部分,具体代码如下:
#-*-coding:utf-8-*-
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
import numpy as np
from testplot2pyqt5 import Ui_Dialog
import matplotlib
matplotlib.use("Qt5Agg")  # 声明使⽤QT5
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
#创建⼀个matplotlib图形绘制类
class MyFigure(FigureCanvas):
def__init__(self,width=5, height=4, dpi=100):
#第⼀步:创建⼀个创建Figure
self.fig = Figure(figsize=(width, height), dpi=dpi)
#第⼆步:在⽗类中激活Figure窗⼝
super(MyFigure,self).__init__(self.fig) #此句必不可少,否则不能显⽰图形
#第三步:创建⼀个⼦图,⽤于绘制图形⽤,111表⽰⼦图编号,如matlab的subplot(1,1,1)        self.axes = self.fig.add_subplot(111)
#第四步:就是画图,【可以在此类中画,也可以在其它类中画】
def plotsin(self):
self.axes0 = self.fig.add_subplot(111)
t = np.arange(0.0, 3.0, 0.01)
s = np.sin(2 * np.pi * t)
self.axes0.plot(t, s)
def plotcos(self):
t = np.arange(0.0, 3.0, 0.01)
s = np.sin(2 * np.pi * t)
self.axes.plot(t, s)
class MainDialogImgBW(QDialog,Ui_Dialog):
def__init__(self):
super(MainDialogImgBW,self).__init__()
self.setupUi(self)
self.setWindowTitle("显⽰matplotlib绘制图形")
self.setMinimumSize(0,0)
#第五步:定义MyFigure类的⼀个实例
self.F = MyFigure(width=3, height=2, dpi=100)
#self.F.plotsin()
self.plotcos()
#第六步:在GUI的groupBox中创建⼀个布局,⽤于添加MyFigure类的实例(即图形)后其他部件。        idlayout = upBox)  # 继承容器groupBox
#补充:另创建⼀个实例绘图并显⽰
self.plotother()
def plotcos(self):
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2 * np.pi * t)
self.F.axes.plot(t, s)
self.F.fig.suptitle("cos")
def plotother(self):
F1 = MyFigure(width=5, height=4, dpi=100)
F1.fig.suptitle("Figuer_4")
F1.axes1 = F1.fig.add_subplot(221)
x = np.arange(0, 50)
y = np.random.rand(50)
F1.axes1.hist(y, bins=50)
F1.axes1.plot(x, y)
F1.axes1.bar(x, y)
F1.axes1.set_title("hist")
F1.axes2 = F1.fig.add_subplot(222)
## 调⽤figure下⾯的add_subplot⽅法,类似于matplotlib.pyplot下⾯的subplot⽅法
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [23, 21, 32, 13, 3, 132, 13, 3, 1]
F1.axes2.plot(x, y)
F1.axes2.set_title("line")
# 散点图
F1.axes3 = F1.fig.add_subplot(223)
F1.axes3.scatter(np.random.rand(20), np.random.rand(20))
F1.axes3.set_title("scatter")
# 折线图
F1.axes4 = F1.fig.add_subplot(224)
x = np.arange(0, 5, 0.1)
F1.axes4.plot(x, np.sin(x), x, np.cos(x))
F1.axes4.set_title("sincos")
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MainDialogImgBW()
main.show()
#app.installEventFilter(main)
<_())
结果如下图:
例2,在上例基础上,添加⼀个TabWidget控件,将绘制的图形显⽰在Tabwidget控件中。【主要修改第六步即可】
#第五步:定义MyFigure类的⼀个实例
self.F = MyFigure(width=3, height=2, dpi=100)
#self.F.plotsin()
self.plotcos()
#**修改第六步**:在GUI的groupBox中创建⼀个布局,⽤于添加MyFigure类的实例(即图形)后其他部件。
# idlayout = upBox)  # 继承容器groupBox
# idlayout.addWidget(self.F,0,1)
vlayout = QVBoxLayout(self.widget)  #在中⼼部件上创建⼀个布局添加TabWidget控件
self.tabwidget = QTabWidget()  # 添加⼀个Tab控件⽤于存放显⽰图像的部件
#下⾯这些属性设置可不要
self.tabwidget.setTabsClosable(True)
self.tabwidget.setUsesScrollButtons(True)
self.tabwidget.setTabPosition(0)
self.tabwidget.setElideMode(2)
self.tabwidget.setMovable(True)
size(300, 500)
vlayout.addWidget(self.tabwidget)
结果:
例3 同样在例1基础上修改第六步,在GroupBox框中添加QGraphicsView视图窗⼝显⽰图形,具体修改如下:
"""修改第六步:在groupBox框中使⽤QGraphicsView控件来显⽰"""
self.scene = QGraphicsScene()  #创建⼀个场景
self.scene.addWidget(self.F)  #将图形元素添加到场景中

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。