Построение в реальном времени с использованием matplotlib - PullRequest
0 голосов
/ 12 января 2019

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

import matplotlib.pyplot as plt
import numpy as np

class Plotter():
    def __init__(self):
        self.error = []
        self.fig, self.ax = plt.subplots()
        self.line, = self.ax.plot(range(len(self.error)), self.error)

    def start_plot(self):
        plt.ion()


    def end_plot(self):
        self.error = []

    def update(self, worker):
        self.error.append(worker.GetMetricValue())
        self.line.set_ydata(self.error)
        return self.line

    def update_plot(self, worker):
        self.error.append(worker.Get_metric_value())
        self.ax.set_ylim(np.min(self.error)*1.1, (np.max(self.error)+0.1)*1.1)
        self.line.set_ydata(self.error)
        self.line.set_xdata(range(len(self.error)))
        self.fig.canvas.draw()
        plt.pause(0.1)
        #self.fig.canvas.flush_events()

    def get_error(self):
        return self.error



class WorkerClass():
    def __init__(self):
        pass

    def Get_metric_value(self):
        return np.random.rand()


def main():
    worker = WorkerClass()
    pltr = Plotter()
    pltr.start_plot()
    for i in range(10):
        print("iteration {}".format(i))
        pltr.update_plot(worker)


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 13 января 2019

Вот исправленная версия кода. Я бы предложил использовать FuncAnimation для анимации, поскольку она более стабильна и работает в цикле событий на рисунке.

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

class Plotter():
    def __init__(self):
        self.worker = WorkerClass()
        self.error = []
        self.fig, self.ax = plt.subplots()
        self.line, = self.ax.plot(range(len(self.error)), self.error)

    def start_plot(self):
        self.ani = FuncAnimation(self.fig, self.update_plot, frames=10, 
                                 interval=100, repeat=False)
        plt.show()

    def end_plot(self):
        self.error = []

    def update_plot(self, i):
        self.error.append(self.worker.Get_metric_value())
        self.line.set_data(range(len(self.error)), self.error)
        self.ax.relim()
        self.ax.autoscale_view()

    def get_error(self):
        return self.error


class WorkerClass():
    def __init__(self):
        pass

    def Get_metric_value(self):
        return np.random.rand()


def main():

    pltr = Plotter()
    pltr.start_plot()

if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...