2017-08-10 12 views
-2

私はPyQt5にmatplotlibAnimationを埋め込む方法を学んでいます。私がa example like thisを下のウィジェットに埋め込んだとき、約100ポイントがyデータリストに追加された後に図が描画されました。なぜ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ウィジェットを定義します。

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

追加の情報を追加するには、ご質問の編集リンクを使用してください。回答を投稿するボタンは、質問に対する完全な回答のためだけに使用してください。 - [レビューの投稿](レビュー/低品質の投稿/ 16989893) – ItamarG3

+0

これはちょっとした間違いでした。あなたはそれを自分で見つけました。しかし、そのような質問は他の人にとって本当に有用ではありません。 – Trilarion

関連する問題