私は、画像データを表示するPyQt4アプリケーションの組み込みコントロールとしてmatplotlibを使用している初心者です。私は、ユーザーがクリックしてドラッグすることによって、イメージ上に線をインタラクティブに描くことを可能にしたいと思っています。私はそれが働いているが、それは使えないほど遅いので、私はそれを正しい方法で行かないと信じている。私がラインを表示できる唯一の方法は、マウスが動くたびにキャンバスを再描画することです(これが減速の原因と思われます)。次のように2D Matplotlibプロットで線をインタラクティブに描画する最も良い方法
例えば、マウスダウンイベントに私は、現在の座標を格納し、プロットにLine2Dオブジェクトを追加します。次のように
def onMouseMove(self, event):
if self.drawingLine:
self.lineStartX = event.xdata
self.lineStopX = event.xdata
self.lineStartY = event.ydata
self.lineStopY = event.ydata
self.line = Line2D([self.lineStartX, self.lineStopX], [self.lineStartY, self.lineStopY], linewidth = 1.5, color = 'r')
self.axes.add_line(self.line)
その後、私のマウス移動イベントで、私はラインを再描画:
def onMouseMove(self, event):
if self.drawingLine:
self.lineStopX = event.xdata
self.lineStopY = event.ydata
# Adjust the line to the new endpoint:
self.line.set_data([self.lineStartX, self.lineStopX], [self.lineStartY, self.lineStopY])
# Force a redraw otherwise you don't see any changes:
self.fig.canvas.draw()
私が述べたように、このアプローチは非常に遅く、したがっておそらく間違っています。誰かがここで適切なアプローチが何であるかを私に手がかりにしてもらえますか?あらかじめありがとうございます。
時間制限を導入すると、線のダイナミクスに遅れが生じます。だから遅れを防ぐために、あなたは遅れを導入する。私には良い解決策のようには聞こえません。 – ImportanceOfBeingErnest
遅れは、matplotlibが線を描くのに時間がかかるためです。 matplotlibに100万回線を描画するように指示すると、プログラムは線を何度も繰り返し描画します。あなたのプログラムは応答しなくなります。 figure.draw_idle()はこれをある程度助けますが、私がmatplotlibがリアルタイムプロットになると遅くなる前に言ったように、これは役に立ちます。 – HashSplat
これを行うmatplotlibの方法は、FunctionAnimation https://matplotlib.org/2.0.0/examples/animation/animate_decay.htmlを使用することです。基本的には、実際にデータを収集してから、タイマの間隔がはるかに遅い別のタイマーでプロット関数を呼び出します。あなたは目を見て特定の速度でしか理解できません。行のすべての微小変化をプロットする必要はありません。ユーザーにスムーズに見えるレートでプロットするだけで済みます。私は、提案された最小値が20-30 fpsだと思います。画面上でのプロットや描画は、非常に時間がかかる非常に高価な操作です。 – HashSplat