我有一个函数,它返回.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库中,您可以为每个图形创建一个新对象,而不是直接在模块中保存状态,这样就不会发生这样的混乱。