2016-12-14 107 views
1

我有一段代碼在matplotlib中繪製了我的cpu使用情況。不過,我覺得這段代碼沒有正確使用FuncAnimation函數。我目前在我的animate循環中使用clear()函數,我相信它會清除所有的軸和圖形?我知道有許多方法可以清除曲線,而不是整個圖形本身,但我不知道如何。當我運行代碼時,它的輸出很好,但是我的CPU使用率有明顯的跳躍。所以編號1)有沒有更好的方式來做我即將做的事情? (實時繪製我的CPU使用情況)。 2.)如果我的方式沒問題,可以採取任何方法來減少資源密集度?更好的方式來實現matplotlib動畫與從cpu的實時數據?

import psutil 
import matplotlib.pyplot as plt 
import matplotlib as mpl 
import matplotlib.animation as animation 
from collections import deque 

fig = plt.figure() 
ax1 = fig.add_subplot(111) 

y_list = deque([-1]*150) 


def animate(i): 

    y_list.pop() 
    y_list.appendleft(psutil.cpu_percent(None,False)) 

    ax1.clear() 
    ax1.plot(y_list) 
    ax1.set_xlim([0, 150]) 
    ax1.set_ylim([0, 100]) 

ax1.axes.get_xaxis().set_visible(False) 

anim = animation.FuncAnimation(fig, animate, interval=200) 
plt.show() 

它看起來很好,當它運行,但我能聽到我的筆記本電腦風扇加一點比我更喜歡的是什麼做的。

enter image description here

回答

1

想通了使用blit=True kwarg並且限定init()函數傳遞到FuncAnimation

fig = plt.figure() 
ax = plt.axes(xlim=(0, 200), ylim=(0, 100)) 
line, = ax.plot([],[]) 

y_list = deque([-1]*400) 
x_list = deque(np.linspace(200,0,num=400)) 


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


def animate(i): 
    y_list.pop() 
    y_list.appendleft(psutil.cpu_percent(None,False)) 
    line.set_data(x_list,y_list) 
    return line, 

anim = animation.FuncAnimation(fig, animate, init_func=init, 
          frames=200, interval=100, blit=True) 

plt.show() 
相關問題