2016-08-22 12 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 report] (https://github.com/matplotlib/matplotlib/issues/6965)를 matplotlib에 제출했다. 곧 패치를 제출 하겠지만, 그때까지 [ArtistAnimation._init_draw] (https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/animation.py#L1200)를 다시 정의하면됩니다.) 메소드는'artist.axes.figure' 대신'artist.get_figure()'를 사용합니다. –