Подскажите есть ли возможность в jupyter рисовать анимированные графики, вроде графика загрузки процессора в реальном времени? Пытаюсь сделать мониторинг времени ответа сервера на пинг.
Разбираюсь с matplotlib, но то ли он такого не умеет, то ли я не нашел.
import subprocess
import re
from matplotlib import pyplot as plt
def ping(adress):
p = subprocess.Popen(["ping.exe",adress], stdout = subprocess.PIPE)
out = p.communicate()[0]
t = re.search(r'time=(\d*)',str(out))
time = t.group().replace('time=','') if t else '0'
return (time)
x=[0]
%matplotlib inline
for i in range(0,10):
x.append(ping('ya.ru'))
plt.plot(x)
График просчитывается весь и отрисовывается весь сразу, подскажите как сделать анимацию и возможно ли вообще такое?
Ответ
Можно так сделать:
import psutil
from datetime import datetime as dt
from collections import deque
import matplotlib.pyplot as plt
from matplotlib.dates import date2num
import matplotlib.animation as animation
%matplotlib notebook
N=600
x = deque([date2num(dt.now())], maxlen=N)
y = deque([0], maxlen=N)
fig, ax = plt.subplots(figsize=(8,3))
line, = ax.plot_date(x, y, marker="")
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
def get_data():
# return ping('ya.ru')
return psutil.cpu_percent(.15)
def animate(i):
x.append(date2num(dt.now()))
y.append(get_data())
ax.relim(visible_only=True)
ax.autoscale_view(True)
line.set_data(x, y)
ax.fill_between(x, -0.5, y, color='lightgrey')
return line,
ani = animation.FuncAnimation(fig, animate, interval=300)
#ani.save("d:/temp/test.gif", writer='imagemagick', fps=10)
plt.show()
Результат:
Комментариев нет:
Отправить комментарий