PyQt5快速开发与实战
文章目录
*
– PyQt5快速开发与实战
–
+ 9. 第9章 PyQt5 扩展应用
+
* 9.4 Matplotlib在PyQt中的应用
*
– 9.4.1 对MatplotlibWidget的解读
– 9.4.2 设置提升的窗口控件
– 9.4.3 MatplotlibWidget的使用
– 9.4.4 更多扩展
9. 第9章 PyQt5 扩展应用
9.4 Matplotlib在PyQt中的应用
Matplotlib是 Python最著名的绘图库,它提供了一整套和 MATLAB相似的命令API,十分适合交互式进行制图。而且也可以方便地将它作为绘图控件,嵌入到GUI应用程序中。
9.4.1 对MatplotlibWidget的解读
- 设置绘图类
class MyMplCanvas(FigureCanvas):
"""FigureCanvas的最终的父类其实是QWidget。"""
def __init__(self, parent=None, width=5, height=4, dpi=100):
plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
self.fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = self.fig.add_subplot(111)
self.axes.hold(False)
FigureCanvas.__init__(self, self.fig)
self.setParent(parent)
'''定义FigureCanvas的尺寸策略,这部分的意思是设置FigureCanvas,使之尽可能的向外填充空间。'''
FigureCanvas.setSizePolicy(self,
QSizePolicy.Expanding,
QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
定义绘制静态图函数(自定义)
'''绘制静态图,可以在这里定义自己的绘图逻辑'''
def start_static_plot(self):
self.fig.suptitle('测试静态图')
t = arange(0.0, 3.0, 0.01)
s = sin(2 * pi * t)
self.axes.plot(t, s)
self.axes.set_ylabel('静态图:Y轴')
self.axes.set_xlabel('静态图:X轴')
self.axes.grid(True)
定义绘制动态图函数,设置每隔1秒重新绘制一次图像。
'''启动绘制动态图'''
def start_dynamic_plot(self, *args, **kwargs):
timer = QtCore.QTimer(self)
timer.timeout.connect(self.update_figure)
timer.start(1000)
'''动态图的绘图逻辑可以在这里修改'''
def update_figure(self):
self.fig.suptitle('测试动态图')
l = [random.randint(0, 10) for i in range(4)]
self.axes.plot([0, 1, 2, 3], l, 'r')
self.axes.set_ylabel('动态图:Y轴')
self.axes.set_xlabel('动态图:X轴')
self.axes.grid(True)
self.draw()
- 封装绘图类
这部分主要是使用 QWidget 把上面的绘图类和工具栏封装到MatplotlibWidget中,只需调用 MatplotlibWidget这个类就可以实现绘图功能了。
class MatplotlibWidget(QWidget):
def __init__(self, parent=None):
super(MatplotlibWidget, self).__init__(parent)
self.initUi()
def initUi(self):
self.layout = QVBoxLayout(self)
self.mpl = MyMplCanvas(self, width=5, height=4, dpi=100)
self.mpl_ntb = NavigationToolbar(self.mpl, self)
self.layout.addWidget(self.mpl)
self.layout.addWidget(self.mpl_ntb)
9.4.2 设置提升的窗口控件
新建QWidget类,并将其提升
对窗口进行布局设置
编辑窗口,ui转py
这里可以发现出错了,把前一文件名改一下
; 9.4.3 MatplotlibWidget的使用
初始化模型并主函数调用
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow, QApplication
from matplotlib_pyqt import Ui_MainWindow
class MainWindow(QMainWindow, Ui_MainWindow):
"""
Class documentation goes here.
"""
def __init__(self, parent=None):
"""
Constructor
@param parent reference to the parent widget
@type QWidget
"""
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.matplotlibwidget_dynamic.setVisible(False)
self.matplotlibwidget_static.setVisible(False)
@pyqtSlot()
def on_pushButton_clicked(self):
"""
Slot documentation goes here.
"""
self.matplotlibwidget_static.setVisible(True)
self.matplotlibwidget_static.mpl.start_static_plot()
@pyqtSlot()
def on_pushButton_2_clicked(self):
"""
Slot documentation goes here.
"""
self.matplotlibwidget_dynamic.setVisible(True)
self.matplotlibwidget_dynamic.mpl.start_dynamic_plot()
if __name__ == "__main__":
import sys
from pyqt5_plugins.examples.exampleqmlitem import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
ui = MainWindow()
ui.show()
sys.exit(app.exec_())
9.4.4 更多扩展
https://matplotlib.org/stable/gallery/index.html
根据示例代码修改MyMplCanvas类,实现更多交互。
Original: https://blog.csdn.net/weixin_44226181/article/details/126081369
Author: Ding Jiaxiong
Title: PyQt5快速开发与实战 9.4 Matplotlib在PyQt中的应用
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/769663/
转载文章受原作者版权保护。转载请注明原作者出处!