如何将同情图保存到缓冲区
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。但要实现您的目标,您必须:
- 使用 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
- 直接使用Matplotlib。在这种情况下,您必须使用
lambdify
创建数值函数,使用 numpy 创建适当的离散化范围,评估函数并创建绘图,然后使用 above-linked 答案。
我正在使用 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。但要实现您的目标,您必须:
- 使用 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
- 直接使用Matplotlib。在这种情况下,您必须使用
lambdify
创建数值函数,使用 numpy 创建适当的离散化范围,评估函数并创建绘图,然后使用 above-linked 答案。