效果图:其实是有qt的组件的,
步骤:
首先搞一个canvas就是画布的意思,画布就是控件这个东西这个画布需要做特殊处理就是MyMplCanvas类里面干的东西,matplotlib里面画的所有东西都是由在这个画布上,下面代码就是画线画三角形,注意三角形都是由plot画出来的,在将这个三角形添加到画布里面.
self.line, = self.canvas.axes.plot(self.x, self.y, animated=True, lw=2)
self.line_OS, = self.canvas.axes.plot([1, 1], [0, 1], color='#000000')
self.polygon = plt.Polygon([[0,0],
[1,0],
[0,1]], color='r', alpha=1, )
self.canvas.axes.add_patch(self.polygon)
全部代码
# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtWidgets
import numpy as np
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from matplotlib.animation import FuncAnimation
from Simulator1 import *
class MyMplCanvas(FigureCanvas):
"""Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)# fig = plt.figure(figsize=(17, 9)) 都可以
self.axes = fig.add_subplot(111)
# We want the axes cleared every time plot() is called
# 默认就是 True
self.axes.hold(True) # 这一句False:刷新坐标轴,效果是每次更新后重新画,True:代表不刷新,在原来的基础上覆盖,效果不好看,应该设置为True
self.compute_initial_figure() # 貌似没用注释了也好使
FigureCanvas.__init__(self, fig) # 这个必须有
self.setParent(parent)# 貌似没用注释了也好使
def compute_initial_figure(self):
pass
class AnimationWidget(QtWidgets.QWidget):
def __init__(self,):
QtWidgets.QWidget.__init__(self)
vbox = QtWidgets.QVBoxLayout()
self.canvas = MyMplCanvas(self, width=5, height=4, dpi=100 )
vbox.addWidget(self.canvas)
hbox = QtWidgets.QHBoxLayout()
self.start_button = QtWidgets.QPushButton("start", self)
self.stop_button = QtWidgets.QPushButton("stop", self)
self.start_button.clicked.connect(self.on_start)
self.stop_button.clicked.connect(self.on_stop)
hbox.addWidget(self.start_button)
hbox.addWidget(self.stop_button)
vbox.addLayout(hbox)
self.setLayout(vbox)
self.x = np.linspace(0, 5 * np.pi, 400)
self.p = 0.0
self.y = np.sin(self.x + self.p)
self.line, = self.canvas.axes.plot(self.x, self.y, animated=True, lw=2)
self.line_OS, = self.canvas.axes.plot([1, 1], [0, 1], color='#000000')
self.polygon = plt.Polygon([[0,0],
[1,0],
[0,1]], color='r', alpha=1, )
self.canvas.axes.add_patch(self.polygon)
def update_line(self, i):
self.p += 0.1
y = np.sin(self.x + self.p)
self.line.set_ydata(y)
self.polygon.set_xy([[0+i/100,0],
[1+i/100,0],
[0+i/100,1]])
return [self.polygon]
def on_start(self):
self.ani = FuncAnimation(self.canvas.figure, self.update_line,
blit = True, interval = 25)
# self.ani.save('sin_test2.gif', writer='imagemagick', fps=10)
pass
def on_stop(self):
self.ani._stop()
if __name__ == "__main__":
qApp = QtWidgets.QApplication(sys.argv)
aw = AnimationWidget()
aw.show()
sys.exit(qApp.exec_())