gpt4 book ai didi

python - 使用 FLask 和 matplotlib 即时生成图像

转载 作者:行者123 更新时间:2023-12-01 01:26:41 25 4
gpt4 key购买 nike

我想绘制图像而不必将其保存在静态文件夹中。

我在这里发布了一个由用户 Messa 发布的示例,运行得很好:

import io
import random
from flask import Response
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure

@app.route('/plot.png')
def plot_png():
fig = create_figure()
output = io.BytesIO()
FigureCanvas(fig).print_png(output)
return Response(output.getvalue(), mimetype='image/png')

def create_figure():
fig = Figure()
axis = fig.add_subplot(1, 1, 1)
xs = range(100)
ys = [random.randint(1, 50) for x in xs]
axis.plot(xs, ys)
return fig

然后在 HTML 文件中:

<img src="/plot.png" alt="my plot">

结果很完美。我即时获取图像。

现在我想使用一些像这样的参数:

@app.route('/<x_values_source>/<y_values_source>/plot.png')
def plot_png(x_values_source, y_values_source):
fig = create_figure(x_values_source, y_values_source)
output = io.BytesIO()
FigureCanvas(fig).print_png(output)
return Response(output.getvalue(), mimetype='image/png')

def create_figure(x_values_source, y_values_source):
x_values = function_that_returns_x_values_set(x_values_source)
y_values = function_that_returns_y_values_set(y_values_source)
fig = Figure()
axis = fig.add_subplot(1, 1, 1)
axis.plot(x_values, y_values)
return fig

但是这当然行不通。我对 Python 还很陌生,而且还在学习很多东西。

谢谢!

最佳答案

要传入参数,最好不要将它们添加到 URI 前面,因为这可能会混淆 Flask 的路由解码。相反,如果您形成如下 URL:

/plot.png?x=1,2,3,4&y=100,200,300,400

您可以通过request.args选取参数。它们将以字符串形式出现,因此您需要将其分离并转换为整数(或 float ,如果您使用实数)

from flask import request

@app.route('/plot.png')
def plot():
try:
x_values = [int(x) for x in request.args.get('x','').split(',')]
y_values = [int(y) for y in request.args.get('y','').split(',')]
except:
# malformed

我有一个工作示例here动态处理 matplotlib 的稳健方法。总体思路是

from flask import send_file

@app.route('/plot.png')
def plot_png():
fig, ax = plt.subplots()
draw(ax)
return fig_response(fig)

def fig_response(fig):
"""Turn a matplotlib Figure into Flask response"""
img_bytes = BytesIO()
fig.savefig(img_bytes)
img_bytes.seek(0)
return send_file(img_bytes, mimetype='image/png')

您提供draw()的位置。不过,请看一下我的示例,因为您需要添加一些缓存 header 。

关于python - 使用 FLask 和 matplotlib 即时生成图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53268133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com