【问题标题】:Serving matplotlib graphs with django without saving使用 django 提供 matplotlib 图而不保存
【发布时间】:2018-01-16 16:48:23
【问题描述】:

我正在使用一个名为 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 对象传递给模板并提供图像,或者这种方法不起作用?是否有其他方法可以做到这一点?

【问题讨论】:

标签: python django matplotlib


【解决方案1】:

在搜索了很长一段时间并摆弄了我的代码后,我设法找到了答案。我在下面提供了我的工作代码的完整示例,因为我可以在网上找到的大多数答案都非常简短和神秘。

进口

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 的 cmets 为我指明了正确的搜索方向。

【讨论】:

    猜你喜欢
    • 2021-07-06
    • 2021-05-25
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    相关资源
    最近更新 更多