使用matplotlib实时绘图,内存泄漏和挂起严重

使用matplotlib实时绘图,内存泄漏和挂起严重,matplotlib,memory,subplot,Matplotlib,Memory,Subplot,在从我的另一个使用子图绘制不同类型图的线程中获得了一些见解之后,我看到了一些严重的警告、巨大的内存泄漏以及最终的应用程序挂起/崩溃。我很确定有更好的方法来实现这个数字更新流程,我愿意接受建议。尝试了blit选项,该选项在大约5-7次迭代中快速运行,然后挂起,但内存使用量仍在不断增加 这里是基本流程,从电子表格中读取大型数据集,针对每一行数据,进行一些处理并生成一些数据集。在多个不同类型的图上绘制这些不同的数据集,这是一个在matlab中运行同一事物的示例 如上所示,需要为每行数据更新所有子批次

在从我的另一个使用子图绘制不同类型图的线程中获得了一些见解之后,我看到了一些严重的警告、巨大的内存泄漏以及最终的应用程序挂起/崩溃。我很确定有更好的方法来实现这个数字更新流程,我愿意接受建议。尝试了blit选项,该选项在大约5-7次迭代中快速运行,然后挂起,但内存使用量仍在不断增加

这里是基本流程,从电子表格中读取大型数据集,针对每一行数据,进行一些处理并生成一些数据集。在多个不同类型的图上绘制这些不同的数据集,这是一个在matlab中运行同一事物的示例

如上所示,需要为每行数据更新所有子批次 子图1-使用imshow 子地块2-条形图 子地块3-等高线图 子图4-可以是直线图或散点图

最终,为每行数据生成的每个图形都需要理想地保存到视频中,但现在保存为图像也不错

import tkinter as tk
from tkinter import filedialog
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

#.. read in the file and load the data ...
# define all plots on a figure
resultsFig = plt.figure(figsize=(12, 6))
resultsFig.show()
# We need to draw the canvas before we start animating...
resultsFig.canvas.draw()
subplot1= resultsFig.add_subplot(311)
subplot1.axis('off')
subplot1.set_title('gaussian')
subplot1.set_anchor('S')
subplot2= resultsFig.add_subplot(312)
subplot2.set_xlabel('Dout')
subplot2.set_ylabel('Ratio')
subplot2.set_anchor('N')
subplot2.set_ylim(0, 0.3)
subplot2.set_xlim(-3.0, 1.5)
subplot2.autoscale(False, tight='True')
subplot3= resultsFig.add_subplot(325, aspect='equal')
subplot3.set_title('ciruclar analysis')
subplot3.set_xlabel('mm (right-left)')
subplot3.set_ylabel('mm (bottom-top)')
subplot3.set_anchor('S')
subplot4= resultsFig.add_subplot(326)
subplot4.set_xlabel('Row#')
subplot4.set_ylabel('Din')
subplot4.set_anchor('S')
subplot4.set_ylim(-4, 4)
subplot4.set_xlim(startRow, endRow)
backgrounds = [resultsFig.canvas.copy_from_bbox(ax.bbox) for ax in (subplot1, subplot2, subplot3, subplot4)]
plt.ion()

# go through rows of data from start row to end row
for frame in range(startRow, endRow):
    ......
    # generate datasets for this row for all subplots
    ......
    # Display all plots
    resultsFig.canvas.restore_region(backgrounds[0])
    subplot1.clear()
    subplot1.imshow(dataArray, cmap='gray')
    subplot1.autoscale(False, tight='True')

    resultsFig.canvas.restore_region(backgrounds[1])
    subplot2.clear()
    subplot2.bar(plot2data[:,0], plot2data[:, 1])

    resultsFig.canvas.restore_region(backgrounds[2])
    subplot3.clear()
    cp = subplot3.contourf(axisrange, axisrange, plot3dataMap, np.linspace(-5, 5, 24)) 
    resultsFig.colorbar(cp, ax=subplot3)

    resultsFig.canvas.restore_region(backgrounds[3])
    subplot4.plot(range(startRow, endRow), plot4data[:, 0], color='blue', linewidth=1.0)
    subplot4.plot(range(startRow, endRow), plot4data[:, 1], color='red', linewidth=1.0)

    plt.tight_layout()
    [resultsFig.canvas.blit(ax.bbox) for ax in (subplot1, subplot2, subplot3, subplot4)]