2016-03-21 22 views
2

Performans sorunları nedeniyle tam arsa yeniden çizilmeden biraz arsa değiştirmek istiyorum. Fare üst arsa üzerinde hareket ederkenÇizgiyi bağımsız olarak temizleyin ve temizleyin

enter image description here

, ben imlecin x pozisyonunda tüm şemalarda noktalı dikey çizgi çizmek istiyorum. Performanstan dolayı, tüm arazileri tekrar çizmek istemiyorum, ama sadece dikey çizgiyi.

axvline() ile ilgili satırları görüntüleyebiliyordum, ancak sonra çizime yeniden tıklanırsa çizilmiş çizgiyi silme problemim var.

Her arsada ikinci katmana sahip olmak isterim, bağımsız çizim yapabilir ve temizleyebilirim. Daha sonra ayrıca, arsa ve dikey çizginin kesişim noktasında bir nokta çizip bunun altındaki y değerini yazdıracağım.

this numaralı belgeyi, etiket ve ölçek gibi bağımsız bir çizimin çizimi hakkında buldum. Ama ben diyagramın bir kısmını yeniden çizmek istiyorum. Ek bir katman veya verimli bir şekilde çizmenin başka bir yolu var mıdır?

Uygulama, matplotlib.backends.backend_qt4agg numaralı PyQt4 numaralı makaleye dayanmaktadır. Ipython dizüstü

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)])   

için

Minimal düzen kodu

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 

cevap

0

Eğer set_xdata kullanarak denediniz benim uygulamada kod azaltılmış? __init__, yani self.vline = ax.axvline(some_x)'daki axvline nesnesine bir başvuru eklemeyi deneyin (kullanmadan önce v hattı gizlemek istiyorsanız, xlims'in dışına ekleyebilirsiniz). Şimdi _on_click'un içinde yeni bir aksvline yapmak yerine self.vline.set_xdata(event.xdata)'u arayın. Sanatçı halihazırda arsada mevcut olduğundan, mpl yalnızca self.vline'u yeniden çizmelidir.

nasıl çalıştığını görmek için aşağıdaki örneği deneyin:

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() 

yani __init__ kendisine göndermeler yapıyor ve sonra self.circle.set_data(new_x, new_y) kullanmak, aynı hile kullanabilirsiniz müdahaleyle için daire çizim.

+0

Herhangi bir veriyi çizmiyorsam, konumunu değiştiren bir satır görüyorum. Güzel. Ancak performans hala çok düşük ve verileri çizirsem, çizgi arsa tarafından gizlenir. 'Zorder' ile uğraşmaya çalıştım ama hiçbir şey değiştirmiyor. – DreyFax

İlgili konular