https://blog.csdn.net/panrenlong/article/details/80183519?ops_request_misc=&request_id=&biz_id=102&utm_term=python%20matplotlib%20%E5%9C%A8%E6%8E%A7%E4%BB%B6%E6%98%BE%E7%A4%BA&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-80183519.first_rank_v2_pc_rank_v29_10
感谢这位大佬的文章,解决了困扰我许久的难题!!!
站在巨人肩膀,在此之上,添加一些给小白(我自己)的更通俗的说明。最好跟上面的文章对比着看。
原文章是在QtDesigner中的”Dialog”类型的界面中的控件上 显示matplotlib曲线绘图,此时我想更改为使用”MainWindow”类型的界面进行显示
; 采用Main Window类型界面进行显示
我将原文章的部分代码进行修改,方便对比查看
- 原文章中的模块区域 testplot2pyqt5 这个是QtDesigner设计好的ui文件转py文件后的名字,根据自己的ui文件转py文件的名字更改即可。方便对比关键区域,我这里都没有更改。
- 将QtDesigner设计出来的ui文件转py文件,网上教程很多,我用的是Pycharm中的自己加上的PyUic的插件(也是网上的教程),有兴趣大家可以去查一下。
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
import numpy as np
from testplot2pyqt5ui import Ui_MainWindow
import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
class MyFigure(FigureCanvas):
def __init__(self,width=5, height=4, dpi=100):
self.fig = Figure(figsize=(width, height), dpi=dpi)
super(MyFigure,self).__init__(self.fig)
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(QMainWindow,Ui_MainWindow):
def __init__(self):
super(MainDialogImgBW,self).__init__()
self.setupUi(self)
self.setWindowTitle("显示matplotlib绘制图形")
self.setMinimumSize(0,0)
self.F = MyFigure(width=3, height=2, dpi=100)
self.plotcos()
self.gridlayout = QGridLayout(self.groupBox)
self.gridlayout.addWidget(self.F,0,1)
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)
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")
self.gridlayout.addWidget(F1, 0, 2)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MainDialogImgBW()
main.show()
sys.exit(app.exec_())
更换为Main Window界面类型的代码仅更改两处,如果想换为Widget类型界面显示,我猜应该差不多。
Main Window类型界面+动态加载ui界面
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
import numpy as np
import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
from PyQt5 import uic
class MyFigure(FigureCanvas):
def __init__(self,width=5, height=4, dpi=100):
self.fig = Figure(figsize=(width, height), dpi=dpi)
super(MyFigure,self).__init__(self.fig)
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():
def __init__(self):
super(MainDialogImgBW,self).__init__()
self.ui = uic.loadUi('testplot2pyqt5ui.ui')
self.ui.setWindowTitle("显示matplotlib绘制图形")
self.ui.setMinimumSize(0,0)
self.F = MyFigure(width=3, height=2, dpi=100)
self.plotcos()
self.gridlayout = QGridLayout(self.ui.groupBox)
self.gridlayout.addWidget(self.F,0,1)
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)
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")
self.gridlayout.addWidget(F1, 0, 2)
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MainDialogImgBW()
main.ui.show()
sys.exit(app.exec_())
QtDesigner界面设计
为了防止有像我一样的小白连QtDesigner也不会用,把界面设置也说一下吧
小总结
- 动态加载ui ,关键是将ui界面的文件load进来,要不他也不知道你的界面长啥样。
from PyQt5 import uic
self.ui = uic.loadUi('testplot2pyqt5ui.ui')
- 凡是需要操作界面内的控件或者界面本事的,必须加 “.ui”
self.ui.xxxxxxx(要干的事情)
Original: https://blog.csdn.net/zwy4769/article/details/114778868
Author: 真男人永不秃头
Title: PYQT5+matplotlib+QtDesigner matplotlib嵌入QtDesigner的控件上进行显示(动态加载ui文件或使用py文件显示界面)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/766742/
转载文章受原作者版权保护。转载请注明原作者出处!