Как обновить / свернуть график на том же рисунке? (Матплотлиб) - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь построить данные для одного и того же рисунка каждые 10 секунд, но после каждой итерации отображается новый рисунок.

Как мне обновить график на том же рисунке?

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

Вот код:

plotToFigure() получает 8.000.000 числовых значений каждые 10 сек. c из data_handler, поэтому np_data_list - это массив, содержащий эти 8.000.000 значений. Затем он отображает данные в виде фигуры (начиная с 1000-го значения каждое 1000-е значение):

 def plotToFigure(self):
    #
    np_data_list = self.data_handler.np_data_list[0]
    x_axis = np.arange(len(np_data_list))
    #
    self.line, = self.axis.plot(x_axis[1000::1000], np_data_list[1000::1000])
    #
    self.canvas = self.figure.canvas
    self.canvas.draw()  # Do I need this?
    self.canvas.flush_events()
    self.background = self.canvas.copy_from_bbox(self.axis.bbox)
    #
    self.figure.show()
    #plt.show() # What is the difference?
    #

updateFigure() снова получает 8.000.000 и должен обновить цифру новыми значениями (второе updateFigure() функция в основном выполняет то же самое, что и первая, но также не обновляет текущую цифру);

Если self.figure.show() отсутствует в коде, будет отображаться только цифра из plotToFigure(), а цифра не будет обновляться:

def updateFigure(self):
    #
    np_data_list = self.data_handler.np_data_list[0]
    self.line.set_ydata(np_data_list[1000::1000])
    #
    self.canvas.restore_region(self.background)  # restore background
    self.axis.draw_artist(self.line)  # redraw just the line
    self.figure.canvas.blit(self.axis.bbox)  # fill in the axes rectangle
    #
    self.figure.show()
    #
    self.background = self.canvas.copy_from_bbox(self.axis.bbox)
    #

'''
def updateFigure(self):
    #
    np_data_list = self.data_handler.np_data_list[0]
    self.line.set_ydata(np_data_list[1000::1000])
    #
    plt.draw()
    plt.pause(0.1)
    #
    #self.canvas.draw() ??
    #self.canvas.flush_events() ??
    #
'''

Это пример, в котором data_handler получает 8.000.000 числовых значений каждые 10 секунд три раза подряд и передает их на плоттер:

# ------ MAIN PROGRAM ------ #
...
...
#
fig, ax = plt.subplots()
data_plotter = class_DataPlotter.DataPlotter(data_handler, fig, ax)
#
data_handler.getDataFromDataAcquisitionObject()
data_plotter.plotToFigure()
#
data_handler.getDataFromDataAcquisitionObject()
data_plotter.updateFigure()
#
data_handler.getDataFromDataAcquisitionObject()
data_plotter.updateFigure()
#
...
...
#

Это результат, который я получаю в Pycharm 1

...