2017-08-10 157 views
-2

我正在學習如何在PyQt5中嵌入matplotlibAnimation。當我將a example like this嵌入到下面的窗口小部件中時,圖中的約100個點已被添加到ydata列表中。爲什麼Matplotlib重繪變慢,當它被嵌入到PyQt5中?

# coding=utf-8 

import numpy as np 
import matplotlib 
# Make sure that we are using QT5 
matplotlib.use('Qt5Agg') 
from matplotlib.figure import Figure 
from matplotlib.animation import TimedAnimation, FuncAnimation 
from matplotlib.lines import Line2D 
from PyQt5 import QtGui, QtWidgets, QtCore 
import time 

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as 
               FigureCanvas 
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as 
               NavigationToolbar 

定義CustomFigCanvas以將其放入小部件中。

class CustomFigCanvas(FigureCanvas, FuncAnimation): 

    def __init__(self): 

     # The data 
     self.xdata = [] 
     self.ydata = [] 
     self.end = float() 
     self.start = float() 

     # The window 
     self.fig = Figure() 
     self.ax = self.fig.add_subplot(111) 
     self.line, = self.ax.plot([], [], lw=2) 
     self.ax.grid() 
     # ax1 settings 
     self.ax.set_xlabel('time') 
     self.ax.set_ylabel('raw data') 

     FigureCanvas.__init__(self, self.fig) 
     FuncAnimation.__init__(self, self.fig, self.Update, self.data_gen,           
        blit=False,interval=40,repeat=False,init_func=self.init) 
     FigureCanvas.setSizePolicy(self, QtWidgets.QSizePolicy.Expanding, 
            QtWidgets.QSizePolicy.Expanding) 

    def data_gen(self): 

     self.cnt = 0 
     self.t = 0 
     while self.cnt < 1000: 
      print(self.cnt) 
      self.cnt += 1 
      self.t += 0.1 
      self.y = np.sin(2 * np.pi * self.t) * np.exp(-self.t/10.) 
      yield self.t, self.y 

    def init(self): 
     self.ax.set_ylim(-1.1, 1.1) 
     self.ax.set_xlim(0, 10) 
     del self.xdata[:] 
     del self.ydata[:] 
     self.line.set_data(self.xdata, self.ydata) 
     return self.line, 

    def Update(self, data): 
     # update the data 
     self.end = time.time() 
     print(self.end - self.start) 
     t, y = data 
     self.xdata.append(t) 
     self.ydata.append(y) 
     xmin, xmax = self.ax.get_xlim() 

     if t >= xmax: 
      self.ax.set_xlim(xmin, 2 * xmax) 
      self.ax.figure.canvas.draw() 
      self.line.set_data(self.xdata, self.ydata) 
     self.start = time.time() 
     print('---------') 
     return self.line, 

定義PyQt Widget。

class MplCanvasWrapper(QtWidgets.QDialog): 

    def __init__(self, parent=None): 
     QtWidgets.QDialog.__init__(self, parent) 
     self.canvas = CustomFigCanvas() 
     self.vbl = QtWidgets.QVBoxLayout() 
     self.ntb = NavigationToolbar(self.canvas, parent) 
     self.btnStart = QtWidgets.QPushButton() 
     self.btnStart.setText('start') 
     self.btnPause = QtWidgets.QPushButton() 
     self.btnPause.setText('end') 

     self.vbl.addWidget(self.ntb) 
     self.vbl.addWidget(self.canvas) 
     self.vbl.addWidget(self.btnStart) 
     self.vbl.addWidget(self.btnPause) 

     self.setLayout(self.vbl) 

     self.btnStart.clicked.connect(self.startPlot) 
     self.btnPause.clicked.connect(self.pausePlot) 

     self.dataX = [] 
     self.dataY = [] 

    def startPlot(self): 
     pass 

    def pausePlot(self): 
     pass 


if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    test_widget = MplCanvasWrapper() 
    test_widget.show() 
    sys.exit(app.exec_()) 

示例平滑地移動。 我怎樣才能改變我的代碼,使移動順利?

回答

0

把這段代碼放在'if'之外就是問題的解決方案。

self.line.set_data(self.xdata,self.ydata)

+2

這一節是爲答案,就可以[編輯您的問題(https://stackoverflow.com/posts/45602874 /編輯)時,請刪除此帖。 – eyllanesc

+0

請使用您問題上的編輯鏈接添加其他信息。後回答按鈕應該只用於問題的完整答案。 - [來自評論](/ review/low-quality-posts/16989893) – ItamarG3

+0

所以這是一個微不足道的錯誤。你好,你自己發現了它。但是這樣的問題對其他人來說並不是很有用。 – Trilarion