Matplotlib 在 io.bytesIo 的不同使用之间保存状态

Tom*_*mmy 5 python buffer matplotlib

我有一个返回 .png 原始内容的函数:

import matplotlib.pyplot as plt
def plotVoltage(dbc,imei,sMonth,sDay,sYear):
    ...
    plt.figure(1) 
    ax = plt.subplot(111)
    ax.plot(Xs,Ys,color='blue',linewidth=2)

    buf = None #DOES NOT SOLVE PROBLEM
    buf = io.BytesIO()
    plt.savefig(buf, format = 'png')
    buf.seek(0)
    return buf.read() 
Run Code Online (Sandbox Code Playgroud)

还有一个 Flask 函数,它将图像作为 HTTP 响应返回:

@app.route('/voltageOverTime', methods=['GET'])
def vot():
   ret = plotVoltage(some_parameters)) 
   resp = Response(response=ret,
                status=200,
                mimetype="image/png")
   return resp
Run Code Online (Sandbox Code Playgroud)

最后,我有一个 .html 文件,/voltageOverTime当单击按钮时,图像源被设置为带有一些参数。问题是,如果我使用不同的参数多次单击按钮,图像会彼此“堆叠”;我看到每条线都绘制在另一条线之上。我认为这与内存缓冲区有关,例如,每次我单击按钮时,它都会添加到该缓冲区中。我怎样才能使这个缓冲区完全刷新?

Mat*_*nen 3

该文档plt.close()表明,在完成绘图后调用应该将其从内存中释放并清理。

在正确设计的 Python 库中,您将为每个图形创建一个新对象,而不是直接在模块中保存状态,这样就不会发生这样的混乱。