使用 django 提供 matplotlib 图形而不保存

Dis*_*dSC 1 python django matplotlib

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

plt.plot([1,2,3,4])
plt.ylabel('some numbers')
some_plot = plt.figure()
Run Code Online (Sandbox Code Playgroud)

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

some_plot.savefig(path, format='png')
Run Code Online (Sandbox Code Playgroud)

问题是我并不是真的想保存每个用户生成的图表,而是只想显示它们。我试图寻找一些相关问题的解决方案。其中一种解决方案是使用 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')
Run Code Online (Sandbox Code Playgroud)

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

Dis*_*dSC 7

经过一段时间的搜索和摆弄我的代码后,我终于找到了答案。我在下面提供了我的工作代码的完整示例,因为我在网上找到的大多数答案都非常简短且神秘。

进口

from io import BytesIO
import base64
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
Run Code Online (Sandbox Code Playgroud)

意见

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

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

模板

<img src="data:image/png;base64, {{ image_base64 }}" alt="somealt" />
Run Code Online (Sandbox Code Playgroud)

感谢 DavidG 和 swatchai 的评论为我指明了正确的搜索方向。