用django服务matplotlib图表而不保存

时间:2018-01-16 16:48:23

标签: python django matplotlib

我正在使用一个名为matplotlib的包来根据用户输入创建一些图形。创建这些图表可以这样完成

plt.plot([1,2,3,4])
plt.ylabel('some numbers')
some_plot = plt.figure()

此外,可以将这些图形保存为图像,

some_plot.savefig(path, format='png')

问题在于我并不是真的想要保存每个用户生成的图形,而是我想只显示它们。我试图找出一些相关问题的解决方案。一种这样的解决方案是使用IoBytes。按照这些答案,我得到像

这样的东西
from io import BytesIO
some_plot_io = BytesIO()

plt.plot([1,2,3,4])
plt.ylabel('some numbers')
some_plot = plt.figure()
some_plot.savefig(some_plot_io, format='png')

是否有可能以某种方式将BytesIO对象传递给模板并提供图像,或者此方法不起作用?是否还有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

经过一段时间的搜索并摆弄我的代码后,我找到了答案。我已经在下面列出了我的工作代码的完整示例,因为我在网上找到的大多数答案都非常简短而且含糊不清。

进口

from io import BytesIO
import base64
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

视图

plt.plot(range(10))
buf = BytesIO()
plt.savefig(buf, format='png')
image_base64 = base64.b64encode(buf.getvalue()).decode('utf-8').replace('\n', '')
buf.close()

然后,您可以将image_base64传递给模板并使用

显示它

模板

<img src="data:image/png;base64, {{ image_base64 }}" alt="somealt" />

感谢DavidG和swatchai的评论,指出我正在寻找正确的方向。