Обновление данных Matplotlib в режиме реального времени для сбора данных - PullRequest
1 голос
/ 01 октября 2019

Я хочу вывести данные в matplotlib в режиме реального времени. Я хочу открыть фигуру один раз в начале программы, а затем обновить фигуру при получении новых данных. Несмотря на то, что было несколько подобных вопросов, ни один из них не ответил на мой конкретный вопрос.

Я хочу, чтобы каждый набор точек данных new_data1 и new_data2 отображался на одной и той же фигуре в конце каждого цикла while, т.е. одна строка после первого цикла while, две строки на одном рисунке после второго цикла whileи т. д. В настоящее время все они построены вместе, но только в конце программы, которая бесполезна для сбора данных в режиме реального времени.

import matplotlib.pyplot as plt
import numpy


hl, = plt.plot([], [])

def update_line(hl, new_datax, new_datay):
    hl.set_xdata(numpy.append(hl.get_xdata(), new_datax))
    hl.set_ydata(numpy.append(hl.get_ydata(), new_datay))
    plt.xlim(0, 50)
    plt.ylim(0,200)
    plt.draw()

x = 1
while x < 5:
    new_data1 = []    
    new_data2 = []
    for i in range(500):
        new_data1.append(i * x)
        new_data2.append(i ** 2 * x)
    update_line(hl, new_data1, new_data2)
    x += 1

else:
    print("DONE")

Эта программа отображает все 5 строк, но в концепрограмма. Я хочу, чтобы каждая линия отображалась одна за другой, после завершения цикла while. Я попытался вставить в функцию plt.pause (0,001), но она не сработала.

Эта программа отличается от той, которая была выдвинута - эта программа строит только один график и не обновляетс течением времени.

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Не уверен, правильно ли я читаю требования, но ниже приведен план. Пожалуйста, измените его в соответствии с вашими требованиями. Возможно, вы захотите изменить функцию Redraw_Function и отредактировать кадры ( параметр ключевого слова , который равен np.arange (1,5,1)) в вызове FuncAnimation. Кроме того, интервал = 1000 означает задержку в 1000 миллисекунд.

Если вы используете Jupyter, закомментируйте вторую последнюю строку (где написано plt.show ()) и раскомментируйте последнюю строку. Это победит вашу цель обновления в реальном времени, но я извиняюсь, у меня были проблемы с тем, чтобы это работало в реальном времени в Jupyter. Однако, если вы используете консоль Python или официальный IDLE, пожалуйста, запустите код как есть. Это должно работать хорошо.

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

fig, ax = plt.subplots()
plot, = plt.plot([],[])

def init_function():
    ax.set_xlim(0,50)
    ax.set_ylim(0,250)
    return plot,

def Redraw_Function(UpdatedVal):
    new_x = np.arange(500)*UpdatedVal
    new_y = np.arange(500)**2*UpdatedVal
    plot.set_data(new_x,new_y)
    return plot,

Animated_Figure = FuncAnimation(fig,Redraw_Function,init_func=init_function,frames=np.arange(1,5,1),interval=1000)
plt.show()
# Animated_Figure.save('MyAnimated.gif',writer='imagemagick')

Когда вы запустите код, вы получите следующий результат. Я пытался сохранить очень мало кода, но мне жаль, если ваше требование было совершенно другим.

С наилучшими пожеланиями,

enter image description here

0 голосов
/ 01 октября 2019

Если я правильно понял ваши спецификации, вы можете немного изменить ваш MWE следующим образом:

import matplotlib.pyplot as plt
import numpy

fig = plt.figure(figsize=(11.69,8.27))
ax = fig.gca()
ax.set_xlim(0, 50)
ax.set_ylim(0,200)

hl, = plt.plot([], [])

def update_line(hl, new_datax, new_datay):
    # re initialize line object each time if your real xdata is not contiguous else comment next line
    hl, = plt.plot([], [])
    hl.set_xdata(numpy.append(hl.get_xdata(), new_datax))
    hl.set_ydata(numpy.append(hl.get_ydata(), new_datay))

    fig.canvas.draw_idle()
    fig.canvas.flush_events()

x = 1
while x < 10:
    new_data1 = []
    new_data2 = []
    for i in range(500):
        new_data1.append(i * x)
        new_data2.append(i ** 2 * x)
    update_line(hl, new_data1, new_data2)
    # adjust pause duration here
    plt.pause(0.5)
    x += 1

else:
    print("DONE")

, который отображает:

rendering

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...