2016-03-21 14 views
2

性能問題のためにプロット全体を再描画せずにプロットを少し変更したい。プロットの一部を再描画してクリアする

enter image description here

マウスは、上のプロットに移動している間、私はカーソルの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 

答えて

0

あなたがset_xdataを使用してみましたか? __init__のaxvlineオブジェクトへの参照を追加してください。たとえば、self.vline = ax.axvline(some_x)(使用する前にvlineを非表示にするにはxlimsの外に置くことができます)。 _on_clickの中に入ったら、新しいaxvlineを作るのではなくself.vline.set_xdata(event.xdata)と呼んでいます。アーティストは既にプロットに表示されているので、mplはself.vlineを再描画するだけです。

は、それがどのように動作するかを確認するために、次の例を試してみてください。

import matplotlib as plt 
fig, ax = plt.subplots(1, 1) 
fig.show() #note that show will only "work" if you use ipython. use plt.show() otherwise. 
vl = ax.axvline(0.3) 
fig.canvas.draw() 
vl.set_xdata(0.6) 
fig.canvas.draw() 
# plt.show() 

傍受のためのあなたの円を描くとき、​​あなたがすなわち__init__でそれを参照して、同じトリックを使用して、self.circle.set_data(new_x, new_y)を使用することができます。

+0

データをプロットしないと、行の位置が変わっています。それはいいです。しかし、パフォーマンスはまだ非常に低く、私がデータをプロットすると、線はプロットによって隠されます。私は 'zorder'で微調整しようとしましたが、何も変わりません。 – DreyFax

関連する問題