-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_())
この例はスムーズに移動しました。 移動をスムーズにするためにコードを変更するにはどうすればよいですか?
このセクションでは、答えのためである、あなたは[あなたの質問を編集]できます(https://stackoverflow.com/posts/45602874 /編集)したい場合は、この投稿を削除してください。 – eyllanesc
追加の情報を追加するには、ご質問の編集リンクを使用してください。回答を投稿するボタンは、質問に対する完全な回答のためだけに使用してください。 - [レビューの投稿](レビュー/低品質の投稿/ 16989893) – ItamarG3
これはちょっとした間違いでした。あなたはそれを自分で見つけました。しかし、そのような質問は他の人にとって本当に有用ではありません。 – Trilarion