2016-08-22 53 views
1

我知道這個話題經常出現,但經過多次嘗試,搜索和放棄之後,我將它帶回給您。python matplotlib blit並更新文本

我有一個類,它包含一個matplotlib圖。在這個圖中,我想要一個文本,當用戶點擊某個鍵時,文本會更新爲某些內容,而不會繪製軸中所有重量較大的東西。它看起來像我需要在這裏blit一個人,但如何?這是一個可行的例子,這是我迄今爲止所能得到的最好的例子。

import matplotlib as mpl 
mpl.use('TkAgg') 
import matplotlib.pyplot as plt 
import numpy as np 

class textUpdater: 
    def __init__(self): 
     self.fig, self.ax = plt.subplots() 
     # self.text = plt.figtext(.02, .14, 'Blibli') 
     self.text = self.ax.text(0, .5, 'Blabla')#, transform = self.ax.transAxes)#, animated=True) 

     self.fig.canvas.mpl_connect('key_press_event', self.action) 
     self.fig.canvas.draw() 

     plt.show() 

    def action(self, event): 
     if event.key == 'z': 
      self.text.set_text('Blooooo') 
      self.ax.draw_artist(self.text) 
      self.fig.canvas.blit(self.text.get_window_extent()) 

textUpdater() 

第一個問題:當事情發生時,前面的文字出現在後面。我希望它消失!

第二:我實際上更喜歡將它作爲無花果文本,不包括任何軸。這聽起來可行嗎?

你是最好的,非常感謝。

回答

2

前面的文字仍然保留,因爲您從未刪除它 - 您剛剛畫出它。爲防止出現這種情況,您應該將圖片保存在文本所在的位置,然後顯示文本,然後在文本發生變化時恢復保存的背景並重新顯示文本。

matplotlib.ArtistAnimation已經這樣做了一切爲你,所以你可以使用它:現在

import matplotlib as mpl 
mpl.use('TkAgg') 
import matplotlib.pyplot as plt 
from matplotlib.animation import ArtistAnimation 
import numpy as np 

class textUpdater: 
    def __init__(self): 
     self.fig, self.ax = plt.subplots() 
     self.text = self.ax.text(.5, .5, 'Blabla') 

     self.fig.canvas.mpl_connect('key_press_event', self.action) 
     self.fig.canvas.draw() 

     self.animation = ArtistAnimation(self.fig, [(self.text,)]) 

     plt.show() 

    def action(self, event): 
     if event.key == 'z': 
      self.text.set_text('Blooooo') 

textUpdater() 

,你的第二個問題,Figure.text將創建屬於只是爲了圖中的文本,但ArtistAnimation不支持不屬於任何軸的藝術家,所以在這種情況下,您可能需要重新定義ArtistAnimation以支持此操作。

+0

謝謝Tim!出於某種原因,我認爲我不得不遠離mpl.animation,但是這是完美的。我會嘗試將這個東西改編爲一個Figure.text。再次感謝。 – Etienne

+0

我已經提交了一個[bug報告](https://github.com/matplotlib/matplotlib/issues/6965)與matplotlib關於不支持這種行爲。我想我會很快提交補丁,但在那之前,你只需要重新定義[ArtistAnimation._init_draw](https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/animation.py#L1200 )方法使用'artist.get_figure()'而不是'artist.axes.figure'。 –