2014-04-22 108 views
1

我測試用隨機數據曲線的matplotlib動畫,我遇到了以下問題:matplotlib動畫:劇情更新問題

  • 軸線範圍XLIMylim幾乎隨機更新, 當我在程序窗口和其他窗口之間切換時。
  • 註解僅示出了上時XLIM和ylim被 更新他們disapear下一幀,直到積再次更新 該幀。
  • 有時劇情的默認菜單凍結或disapear。

這些問題可能出現在Linux和Windows(略有不同)。

如果我執行線程或最終多處理?或者是別的什麼?

# -*- coding: utf-8 -*- 

import re 
import time 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import animation 
from mpl_toolkits.axes_grid.anchored_artists import AnchoredText 
import random 


def init(): 
    line.set_data([], []) 
    return line, 

def animate(i): 
    y = random.randint(750, 2000) 
    xdata.append(i) 
    ydata.append(y) 
    xmin, xmax = ax.get_xlim() 
    ymin, ymax = ax.get_ylim() 
    print xmin, xmax 
    print ymin, ymax 

    ###changing the xmax dynamically 
    if i >= xmax: 
     ax.set_xlim(xmin, xmax+(xmax/2)) 
     ax.figure.canvas.draw() 

    ###changing the ymax dynamically 
    if y >= ymax: 
     ax.set_ylim(ymin, y+(y/10)) 
     ax.figure.canvas.draw() 

    #line.set_data(x, y) 
    line.set_data(xdata, ydata) 

    if y < 900: 
     annotation = ax.annotate('Min', xy=(i, y-5)) 

    return line, annotation 
#------------------------------------------ 
#initial max x axis 
init_xlim = 5 
init_ylim = 2000 

fig = plt.figure() 
ax = plt.axes(xlim=(0, init_xlim), ylim=(0, init_ylim)) 
ax.grid() 
line, = ax.plot([], [], lw=2) 
xdata, ydata = [], [] 

annotation = ax.annotate('Min', xy=(-1,-1)) 
annotation.set_animated(True) 

anim = animation.FuncAnimation(fig, animate, init_func=init,frames=2000, interval=1000, blit=True) 
plt.show() 

回答

2

TL; DR關掉所有東西都會「起作用」,但可能會很慢。

您正在使用blitting在底層代碼中做出假設,唯一改變的將是軸區域中的東西(即不是滴答),並且您將在固定背景上重新繪製。該塊傳輸的作品就是GUI畫布上的圖像的一份拷貝,每次更新副本位塊傳輸回GUI窗口(即保存狀態的框架的方法是在init功能的結束狀態那FuncAnimation需要)。然後,由您的函數返回的藝術家將繪製在此保存的畫布上。以這種方式更新的區域是您的座標軸「內部」的區域。每次都不會重新繪製刻度標籤,因爲繪圖文本很昂貴。

因此,你的刻度標記時,系統將觸發一個完整的重繪只更新(通過改變窗口觸發),同樣有,他們顯示出來,因爲重繪吸引所有藝術家的註解。它們在下一幀中再次離開,因爲它們不是在保存的「基本」畫布上b)未包含在由回調函數返回的繪製事件列表中。

如果你真的必須使用塊傳輸,並添加藝術家每次通過你必須做更多的工作,瞭解動畫的基礎設施是如何工作的。

+0

謝謝tcaswell,確實沒有blitting好多了。 – AJN