io.bytesIo的不同用途之间的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() 

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

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

最后,我有一个.html文件,当点击按钮时,图像源被设置为/voltageOverTime,并带有一些参数。问题是,如果我用不同的参数多次点击按钮,图像就会"堆积在一起";我看到每一条线都画在一起。我认为这与内存缓冲区有关,例如,每次我单击按钮时,它都会添加到此缓冲区。如何使此缓冲区完全清空?

要使用pyplot接口完成此操作:

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
import matplotlib.figure
from matplotlib.figure import Figure
def demo():
    fig = Figure(figsize=(10,  10), dpi=100)
    canvas = FigureCanvas(fig)
    ax = fig.add_axes([.1, .1, .8, .8])
    ax.plot(range(15))
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    buf = io.BytesIO()
    fig.savefig(buf, format='png')
    buf.seek(0)
    return buf.read() 

文档指出,在完成绘图后调用plt.close()应该会将其从内存中释放出来并进行清理。

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

相关内容

  • 没有找到相关文章

最新更新