Поиск…


Вступление

С помощью python matplotlib вы можете правильно создавать анимированные графики.

Базовая анимация с FuncAnimation

Пакет matplotlib.animation предлагает несколько классов для создания анимаций. FuncAnimation создает анимации, повторно вызывая функцию. Здесь мы используем функцию animate() которая меняет координаты точки на графике синусоидальной функции.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

TWOPI = 2*np.pi

fig, ax = plt.subplots()

t = np.arange(0.0, TWOPI, 0.001)
s = np.sin(t)
l = plt.plot(t, s)

ax = plt.axis([0,TWOPI,-1,1])

redDot, = plt.plot([0], [np.sin(0)], 'ro')

def animate(i):
    redDot.set_data(i, np.sin(i))
    return redDot,

# create animation using the animate() function
myAnimation = animation.FuncAnimation(fig, animate, frames=np.arange(0.0, TWOPI, 0.1), \
                                      interval=10, blit=True, repeat=True)

plt.show()

введите описание изображения здесь

Сохранить анимацию в gif

В этом примере мы используем save метод для сохранения Animation объекта с помощью ImageMagick.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib import rcParams

# make sure the full paths for ImageMagick and ffmpeg are configured
rcParams['animation.convert_path'] = r'C:\Program Files\ImageMagick\convert'
rcParams['animation.ffmpeg_path'] = r'C:\Program Files\ffmpeg\bin\ffmpeg.exe'

TWOPI = 2*np.pi

fig, ax = plt.subplots()

t = np.arange(0.0, TWOPI, 0.001)
s = np.sin(t)
l = plt.plot(t, s)

ax = plt.axis([0,TWOPI,-1,1])

redDot, = plt.plot([0], [np.sin(0)], 'ro')

def animate(i):
    redDot.set_data(i, np.sin(i))
    return redDot,

# create animation using the animate() function with no repeat
myAnimation = animation.FuncAnimation(fig, animate, frames=np.arange(0.0, TWOPI, 0.1), \
                                      interval=10, blit=True, repeat=False)

# save animation at 30 frames per second 
myAnimation.save('myAnimation.gif', writer='imagemagick', fps=30)

Интерактивные элементы управления с помощью matplotlib.widgets

Для взаимодействия с сюжетами Matplotlib предлагает GUI нейтральных виджеты . Виджеты требуют объекта matplotlib.axes.Axes .

Вот демоверсия слайдера, которая ù обновляет амплитуду кривой синуса. Функция обновления активируется событием on_changed() слайдера.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.widgets import Slider

TWOPI = 2*np.pi

fig, ax = plt.subplots()

t = np.arange(0.0, TWOPI, 0.001)
initial_amp = .5
s = initial_amp*np.sin(t)
l, = plt.plot(t, s, lw=2)

ax = plt.axis([0,TWOPI,-1,1])

axamp = plt.axes([0.25, .03, 0.50, 0.02])
# Slider
samp = Slider(axamp, 'Amp', 0, 1, valinit=initial_amp)

def update(val):
    # amp is the current value of the slider
    amp = samp.val
    # update curve
    l.set_ydata(amp*np.sin(t))
    # redraw canvas while idle
    fig.canvas.draw_idle()

# call update function on slider value change
samp.on_changed(update)

plt.show()

введите описание изображения здесь Другие доступные виджеты:

Строить живые данные из трубы с помощью matplotlib

Это может быть полезно, когда вы хотите визуализировать входящие данные в режиме реального времени. Эти данные могут, например, поступать от микроконтроллера, который непрерывно сэмплирует аналоговый сигнал.

В этом примере мы получим наши данные из именованного канала (также известного как fifo). В этом примере данные в трубе должны быть числами, разделенными символами новой строки, но вы можете адаптировать их по своему вкусу.

Пример данных:

100
123.5
1589

Дополнительная информация о названных каналах

Мы также будем использовать datatype deque из стандартных коллекций библиотек. Объект deque очень похож на список. Но с объектом deque довольно легко добавить что-то к нему, сохраняя при этом объект deque фиксированной длины. Это позволяет нам удерживать ось x на фиксированной длине, а не всегда увеличивать и сжимать график вместе. Дополнительная информация о объектах deque

Выбор правильного бэкэнда имеет жизненно важное значение для производительности. Проверьте, какие серверы работают в вашей операционной системе, и выберите быстрый. Для меня работали только qt4agg и бэкэнд по умолчанию, но по умолчанию он был слишком медленным. Дополнительная информация о бэкэндах в matplotlib

Этот пример основан на примере matplotlib для построения случайных данных .

Ни один из символов этого кода не должен удаляться.

import matplotlib
import collections
#selecting the right backend, change qt4agg to your desired backend
matplotlib.use('qt4agg')
import matplotlib.pyplot as plt
import matplotlib.animation as animation

#command to open the pipe
datapipe = open('path to your pipe','r')

#amount of data to be displayed at once, this is the size of the x axis
#increasing this amount also makes plotting slightly slower
data_amount = 1000

#set the size of the deque object
datalist = collections.deque([0]*data_amount,data_amount)

#configure the graph itself
fig, ax = plt.subplots()
line, = ax.plot([0,]*data_amount)

#size of the y axis is set here
ax.set_ylim(0,256)

def update(data):
        line.set_ydata(data)
        return line,

def data_gen():
    while True:
        """
        We read two data points in at once, to improve speed
        You can read more at once to increase speed
        Or you can read just one at a time for improved animation smoothness
        data from the pipe comes in as a string,
        and is seperated with a newline character,
        which is why we use respectively eval and rstrip.
        """
        datalist.append(eval((datapipe.readline()).rstrip('\n')))
        datalist.append(eval((datapipe.readline()).rstrip('\n')))
        yield datalist

ani = animation.FuncAnimation(fig,update,data_gen,interval=0, blit=True)
plt.show()

Если ваш участок начинает задерживаться через некоторое время, попробуйте добавить больше данных datalist.append, чтобы больше строк считывалось каждый кадр. Или выберите более быстрый бэкэнд, если сможете.

Это работало с данными 150 Гц с трубки на моем 1,7 Гц i3 4005u.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow