Как сохранить смещение оси X и показать более свежие данные, используя matplotlib.animation в Python? - PullRequest
0 голосов
/ 03 апреля 2020

Я довольно новичок в python 3, и в настоящее время я немного изучаю анимацию. FuncAnimation в matplotlib. Я написал небольшую программу, которая отображает время использования процессора. Однако, поскольку все больше и больше данных отображается, график сжимается влево. Я хочу, чтобы значения оси x продолжали смещаться по мере обновления данных. Я думаю, что этот вопрос был поднят здесь: Обновление значений оси X с помощью анимации matplotlib . Тем не менее, я не мог следовать этому так хорошо. Я хочу добиться чего-то подобного

:: http://www.roboticslab.ca/matplotlib-animation/

Было бы здорово, если бы кто-то мог помочь мне в этом. Спасибо!

Вот мой код:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import psutil
%matplotlib widget
fig = plt.figure()
ax1 = fig.add_subplot(111)

cpu = []
def animate(i):
    cpu.append(psutil.cpu_percent())

    ax1.clear()
    ax1.plot(cpu)

ani = animation.FuncAnimation(fig, animate, interval = 1000)
plt.show()

Использование Jupyter Lab 1.0.7

macOS 10.15

1 Ответ

0 голосов
/ 03 апреля 2020

Похоже, что вы попали в ту же ловушку, что и 90% людей, спрашивающих об анимации и matplotlib, в том смысле, что вы неоднократно вызываете plot () на каждом шаге ваших итераций, вместо обновления свойств существующего. .

Общая процедура для анимации заключается в следующем:

  • создать свою фигуру и все фиксированные элементы, которые не нужно обновлять
  • создать художников, которые нуждаются чтобы обновить и сохранить ссылку на них
  • в вашем l oop, обновите (вместо замены или создания новых художников) свойства художников, созданных на предыдущем шаге.

код:

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import psutil

N = 50 # number of points to keep
cpu = np.full(shape=(N,), fill_value=np.nan)

fig, ax = plt.subplots()
line, = ax.plot(cpu, 'r-')
ax.set_ylim(0,100)
ax.set_xlim(0,N)

def animate(i):
    cpu[:-1] = cpu[1:] # shift values one place to the left
    cpu[-1] = psutil.cpu_percent()
    line.set_ydata(cpu)

ani = animation.FuncAnimation(fig, animate, interval = 1000)

enter image description here

...