如何将同情图保存到缓冲区

How to save sympy plot to a buffer

我正在使用 fastapi 编写 API,其中有一个用于绘制任意图形的端点。客户端将图形方程发布到服务器,服务器 return 绘制图表。这是我当前的实现:

import fastapi
import uvicorn
from sympy import plot, parse_expr
from pydantic import BaseModel

api = fastapi.FastAPI()

class Eq(BaseModel):
    eq: str

@api.post('/plot/')
async def plotGraph(eq: Eq):
    exp = parse_expr(eq.eq)
    p = plot(exp, show=False)
    p.save('./plot.png')
    return fastapi.responses.FileResponse('./plot.png')

uvicorn.run(api, port=3006, host="127.0.0.1")

事情是这样的,我将绘图保存在硬盘上,然后使用 FileResponse 再次读取它,这有点多余。

如何将底层图像对象return发送给客户端而不需要先将其写入硬盘?

SymPy 使用 Matplotlib。但要实现您的目标,您必须:

  1. 使用 SymPy 绘图并使用 the answer to this question。当您调用 p.save() 时,它会执行一些重要的命令。由于我们不想调用 p.save(),因此我们必须执行这些命令来生成绘图。
# after this command, p only contains basic information
# to create the plot
p = plot(sin(x), show=False)
# now we create Matplotlib figure and axes
p._backend = p.backend(p)
# then we populate the plot with the data
p._backend.process_series()

# now you are ready to use this answer:
# 

# this is how you access savefig
p._backend.fig.savefig
  1. 直接使用Matplotlib。在这种情况下,您必须使用 lambdify 创建数值函数,使用 numpy 创建适当的离散化范围,评估函数并创建绘图,然后使用 above-linked 答案。