python pyqt5 matplotlib繪圖

import sys
import random
import matplotlib

matplotlib.use("Qt5Agg")
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QSizePolicy, QWidget
from numpy import arange, sin, pi
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

class MyMplCanvas(FigureCanvas):
"""FigureCanvas的最終的父類其實是QWidget。"""

def __init__(self, parent=None, width=5, height=4, dpi=100):

    # 配置中文顯示
    plt.rcParams['font.family'] = ['SimHei']  # 用來正常顯示中文標(biāo)簽
    plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負(fù)號

    self.fig = Figure(figsize=(width, height), dpi=dpi)  # 新建一個figure
    self.axes = self.fig.add_subplot(111)  # 建立一個子圖,如果要建立復(fù)合圖,可以在這里修改

    #self.axes.hold(False)  # 每次繪圖的時候不保留上一次繪圖的結(jié)果

    FigureCanvas.__init__(self, self.fig)
    self.setParent(parent)

    '''定義FigureCanvas的尺寸策略,這部分的意思是設(shè)置FigureCanvas,使之盡可能的向外填充空間。'''
    FigureCanvas.setSizePolicy(self,
                               QSizePolicy.Expanding,
                               QSizePolicy.Expanding)
    FigureCanvas.updateGeometry(self)

'''繪制靜態(tài)圖,可以在這里定義自己的繪圖邏輯'''

def start_static_plot(self):
    self.fig.suptitle('測試靜態(tài)圖')
    t = arange(0.0, 3.0, 0.01)
    s = sin(2 * pi * t)
    self.axes.plot(t, s)
    self.axes.set_ylabel('靜態(tài)圖:Y軸')
    self.axes.set_xlabel('靜態(tài)圖:X軸')
    self.axes.grid(True)

'''啟動繪制動態(tài)圖'''

def start_dynamic_plot(self, *args, **kwargs):
    timer = QtCore.QTimer(self)
    timer.timeout.connect(self.update_figure)  # 每隔一段時間就會觸發(fā)一次update_figure函數(shù)。
    timer.start(1000)  # 觸發(fā)的時間間隔為1秒。

'''動態(tài)圖的繪圖邏輯可以在這里修改'''

def update_figure(self):
    self.fig.suptitle('測試動態(tài)圖')
    l = [random.randint(0, 10) for i in range(4)]
    self.axes.plot([0, 1, 2, 3], l, 'r')
    self.axes.set_ylabel('動態(tài)圖:Y軸')
    self.axes.set_xlabel('動態(tài)圖:X軸')
    self.axes.grid(True)
    self.draw()

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.start_static_plot() # 如果你想要初始化的時候就呈現(xiàn)靜態(tài)圖,請把這行注釋去掉
    #self.mpl.start_dynamic_plot() # 如果你想要初始化的時候就呈現(xiàn)動態(tài)圖,請把這行注釋去掉
    self.mpl_ntb = NavigationToolbar(self.mpl, self)  # 添加完整的 toolbar

    self.layout.addWidget(self.mpl)
    self.layout.addWidget(self.mpl_ntb)

if name == 'main':
app = QApplication(sys.argv)
ui = MatplotlibWidget()
ui.mpl.start_static_plot() # 測試靜態(tài)圖效果
# ui.mpl.start_dynamic_plot() # 測試動態(tài)圖效果
ui.show()
sys.exit(app.exec_())

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容