matplotlib 结合qt 画动态图

 

 

效果图:其实是有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_())

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值