性能問題のためにプロット全体を再描画せずにプロットを少し変更したい。プロットの一部を再描画してクリアする
マウスは、上のプロットに移動している間、私はカーソルのx位置にすべてのダイアグラム上の点線の垂直線を描きたいです。パフォーマンスのために、私はプロット全体をもう一度描くのではなく、垂直線だけを描きたいと思います。
axvline()
をクリックして線を表示することができましたが、プロットを再度クリックすると描画された線を削除するのに問題があります。
私は各プロットに2番目のレイヤーを持たせたいと思います。私は描画して独立させることができます。後で私はさらにプロットと垂直線の交差点に点を描き、その下にy値を表示したいと思います。
私はthisというラベルとスケールのような独立したプロットの部分を描くことがわかりました。しかし、私は図の一部を再描画したい。効率的に描画するために追加のレイヤーや他の方法を得るためにとにかくありますか?
PyQt4
を基にして、matplotlib.backends.backend_qt4agg
を基にしています。
IPythonのノートブックのための最小限のレイアウトコード
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(3, 2, wspace=0.1, height_ratios=[3,1,1])
main_plot = plt.subplot(gs[0, :])
sub_plots = [plt.subplot(gs[1, x]) for x in range(2)]
sub_plots.extend([plt.subplot(gs[2, x]) for x in range(2)])
main_plot.plot(np.arange(100), [np.random.randint(0, 100) for y in range(100)])
for sub_plot in sub_plots:
sub_plot.plot(np.arange(100), [np.random.randint(0, 100) for y in range(100)])
私のアプリケーションでの減少コード
def __init__(self):
self.figure = Figure((20.0, 10.0), dpi=100)
self.figure.patch.set_color('w')
gs = gridspec.GridSpec(3, 2, wspace = 0.1, height_ratios=[3, 1, 1])
self.main_plot = self.figure.add_subplot(gs[0, :])
self.sub_plots = [self.figure.add_subplot(gs[1, x]) for x in range(2)]
self.sub_plots.extend([self.figure.add_subplot(gs[2, x]) for x in range(2)])
self.plotCanvas = FigureCanvas(self.figure)
self.plotCanvas.mpl_connect('button_press_event', self._on_click)
def _on_click(self, event):
if event.inaxes == self.main_plot:
self.main_plot.axvline(event.xdata)
for plot_area in self.sub_plots:
plot_area.axvline(event.xdata)
self.plotCanvas.draw()
return
データをプロットしないと、行の位置が変わっています。それはいいです。しかし、パフォーマンスはまだ非常に低く、私がデータをプロットすると、線はプロットによって隠されます。私は 'zorder'で微調整しようとしましたが、何も変わりません。 – DreyFax