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的最終的父類其實(shí)是QWidget厂捞。"""
def __init__(self, parent=None, width=5, height=4, dpi=100):
# 配置中文顯示
plt.rcParams['font.family'] = ['SimHei'] # 用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False # 用來(lái)正常顯示負(fù)號(hào)
self.fig = Figure(figsize=(width, height), dpi=dpi) # 新建一個(gè)figure
self.axes = self.fig.add_subplot(111) # 建立一個(gè)子圖阴孟,如果要建立復(fù)合圖,可以在這里修改
#self.axes.hold(False) # 每次繪圖的時(shí)候不保留上一次繪圖的結(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('測(cè)試靜態(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)
'''啟動(dòng)繪制動(dòng)態(tài)圖'''
def start_dynamic_plot(self, *args, **kwargs):
timer = QtCore.QTimer(self)
timer.timeout.connect(self.update_figure) # 每隔一段時(shí)間就會(huì)觸發(fā)一次update_figure函數(shù)拷姿。
timer.start(1000) # 觸發(fā)的時(shí)間間隔為1秒。
'''動(dòng)態(tài)圖的繪圖邏輯可以在這里修改'''
def update_figure(self):
self.fig.suptitle('測(cè)試動(dòng)態(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('動(dòng)態(tài)圖:Y軸')
self.axes.set_xlabel('動(dòng)態(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() # 如果你想要初始化的時(shí)候就呈現(xiàn)靜態(tài)圖缴淋,請(qǐng)把這行注釋去掉
#self.mpl.start_dynamic_plot() # 如果你想要初始化的時(shí)候就呈現(xiàn)動(dòng)態(tài)圖准给,請(qǐng)把這行注釋去掉
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() # 測(cè)試靜態(tài)圖效果
# ui.mpl.start_dynamic_plot() # 測(cè)試動(dòng)態(tài)圖效果
ui.show()
sys.exit(app.exec_())