如何将PandasAI生成的图表作为Flask API响应在浏览器展示?
问题:如何将PandasAI生成的图片作为Flask API响应返回
调用Flask API地址http://localhost:3000/gdpChart时,PandasAI生成的图表会弹出窗口,但无法直接作为API响应在浏览器中显示,需要调整代码实现图片的直接返回。
解决方案
通过修改matplotlib后端配置,并将图表保存到内存字节流中,再通过Flask的send_file返回响应,具体修改如下:
修改后的完整代码
from pandasai import PandasAI from pandasai.llm.openai import OpenAI import pandas as pd import os from flask import send_file, Flask import io import matplotlib.pyplot as plt app = Flask(__name__) port = int(os.environ.get('PORT', 3000)) @app.route('/gdpChart/') def getChart(): # 切换为非交互式后端,禁止弹出图片窗口 plt.switch_backend('Agg') # 初始化OpenAI LLM和PandasAI llm = OpenAI(api_token='<<<<<my_api_token>>>>>') pandas_ai = PandasAI(llm) # 示例数据 df1 = pd.DataFrame({ "country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"], "gdp": [21400000, 2940000, 2830000, 3870000, 2160000, 1350000, 1780000, 1320000, 516000, 14000000], "happiness_index": [7.3, 7.2, 6.5, 7.0, 6.0, 6.3, 7.3, 7.3, 5.9, 5.0] }) # 修正prompt描述(饼图对应slice而非bar) prompt = 'Plot the pie chart of countries showing each country\'s GDP, using different colors for each slice' # 运行PandasAI生成图表,此时不会弹出窗口 pandas_ai.run(df1, prompt=prompt, is_conversational_answer=False) # 将图表写入内存字节流 bytes_image = io.BytesIO() plt.savefig(bytes_image, format='png') bytes_image.seek(0) # 将流指针重置到起始位置 # 返回图片响应 return send_file(bytes_image, mimetype='image/png') if __name__ == '__main__': app.run(host='0.0.0.0', port=port)
关键修改说明
- 切换matplotlib后端:添加
plt.switch_backend('Agg'),使用非交互式后端生成图表,避免弹出本地图片窗口,同时支持将图表保存到内存。 - 捕获并保存图表到内存:调用
pandas_ai.run后,通过plt.savefig将当前上下文的图表写入io.BytesIO内存流,无需保存到本地文件。 - 返回正确的响应:使用
send_file返回内存流,设置mimetype='image/png'与保存的图片格式匹配,确保浏览器能正确解析显示。
内容的提问来源于stack exchange,提问作者F H
相关产品推荐
相关产品推荐

