-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathMatplotlibWidget.py
More file actions
104 lines (82 loc) · 3.86 KB
/
MatplotlibWidget.py
File metadata and controls
104 lines (82 loc) · 3.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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=2, dpi=100):
# 配置中文显示
plt.rcParams['font.family'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
self.fig = Figure(figsize=(width, height), dpi=dpi) # 新建一个figure
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('测试静态图')
self.axes.cla()
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)
self.draw()
'''启动绘制动态图'''
def start_dynamic_plot(self, *args, **kwargs):
timer = QtCore.QTimer(self)
timer.timeout.connect(self.update_figure) # 每隔一段时间就会触发一次update_figure函数。
timer.start(1000) # 触发的时间间隔为1秒。
'''动态图的绘图逻辑可以在这里修改'''
def update_figure(self):
self.axes.cla()
# 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()
def draw_spec(self, wave_len, spec_val, color=None, label=None, clean=True):
if clean:
self.axes.cla()
# t = arange(0.0, 3.0, 0.01)
# s = sin(2 * pi * t)
self.axes.plot(wave_len, spec_val)
# self.axes.set_ylabel('静态图:Y轴')
# self.axes.set_xlabel('静态图: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() # 如果你想要初始化的时候就呈现静态图,请把这行注释去掉
#self.mpl.start_dynamic_plot() # 如果你想要初始化的时候就呈现动态图,请把这行注释去掉
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() # 测试静态图效果
ui.mpl.start_dynamic_plot() # 测试动态图效果
ui.show()
sys.exit(app.exec_())