График обновления данных Matplotlib в реальном времени

#python #matplotlib #plot

#python #matplotlib #график

Вопрос:

Я хочу использовать некоторые данные, полученные инструментами. Работает следующее (случайные данные в качестве примера):

 import matplotlib.pyplot as plt 
from matplotlib.animation import FuncAnimation
import random
from itertools import count
import time

%matplotlib qt  

fields, volts = [], []
index = count()

def animate(i):    
    global fields, volts
    fields.append(next(index))
    volts.append(random.randint(0, 5))
    plt.cla()
    plt.plot(fields, volts)

fig = plt.figure(figsize=(8,4))
ax = fig.add_subplot(111)
ani = FuncAnimation(fig, animate, 1000)
plt.show()
  

… но мне нужно, чтобы обновление данных происходило вне FuncAnimation, в его собственном цикле.
Я полагал, что это может сработать, но следующий код просто открывает окно и не обновляет его, пока я не остановлю программу:

 fields, volts = [], []
index = count()

def animate(i):    
    global fields, volts
    
    plt.cla()
    plt.plot(fields, volts)

fig = plt.figure(figsize=(8,4))
ax = fig.add_subplot(111)
ani = FuncAnimation(fig, animate, 1000)
plt.show()

while (True):
    time.sleep(1)
    fields.append(next(index))
    volts.append(random.randint(0, 5))
   
  

Ответ №1:

Попробуйте это, FuncAnimation периодически вызывает ваш animate, чтобы вы могли перенести свои операторы append в этот цикл, а также управлять интервалом, используя аргумент interval ключевого слова.

 fields, volts = [], [] 
index =iter(range(20)) 
from numpy import random 
 
def animate(i):     
    global fields, volts 
    fields.append(len(volts)) 
    volts.append(random.randint(0,5)) 
    plt.cla() 
    plt.plot(fields, volts, c='c') 
 
fig = plt.figure(figsize=(8,4))
ax = fig.add_subplot(111)
ani = FuncAnimation(fig, animate, frames=20, interval=1000)
plt.show()