如何将Matplotlib/Plotly图表上传至AWS S3存储桶?
无法将Matplotlib/Plotly图表写入S3存储桶的解决方法
问题背景
使用Matplotlib和Plotly生成图表后,无法直接写入S3存储桶:
- 执行
fig1.savefig('s3://my_bucket_name/fig1.png')报错:
'no such file or directory s3://my_bucket...'
- 用boto3的
upload_file上传Plotly图表失败,但data.to_csv('s3://my_bucket_name/data.csv')可成功写入。
原测试代码:
import pandas as pd import boto3 import plotly.express as px path = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/monthly-car-sales.csv' data = pd.read_csv(path) data.rename(columns = {'Month':'ds', 'Sales':'y'}, inplace=True) fig1 = data.plot() # Matplotlib Axes对象 ### fig2=px.line(data, x='ds', y='y') # Plotly Figure对象
解决方法
1. Matplotlib图表写入S3
Matplotlib默认不支持直接写入S3路径,可通过两种方式解决:
方法一:临时文件 + boto3上传
# 注意:data.plot()返回的是Axes对象,需调用.figure获取可保存的Figure对象 temp_file = '/tmp/fig1.png' fig1.figure.savefig(temp_file) # 用boto3上传到S3 s3_client = boto3.client('s3') s3_client.upload_file(temp_file, Bucket='my_bucket_name', Key='fig1.png')
方法二:用s3fs让Matplotlib支持S3路径
先安装依赖:
pip install s3fs
之后直接用S3路径保存:
fig1.figure.savefig('s3://my_bucket_name/fig1.png')
2. Plotly图表写入S3
Plotly图表对象不能直接传入boto3的upload_file,需先导出为静态文件再上传:
方法一:导出PNG后上传
先安装导出依赖:
pip install kaleido
执行代码:
temp_plotly_file = '/tmp/fig2.png' fig2.write_image(temp_plotly_file) # boto3上传 s3_client = boto3.client('s3') s3_client.upload_file(temp_plotly_file, Bucket='my_bucket_name', Key='fig2.png')
方法二:直接写入S3路径(依赖s3fs)
安装s3fs后,直接用Plotly的write_image写入S3:
fig2.write_image('s3://my_bucket_name/fig2.png')
关键注意点
- Pandas的
to_csv支持S3是因为内部集成了云存储适配,但Matplotlib/Plotly默认无此能力,需借助s3fs或临时文件中转。 - boto3的
upload_file仅接受本地文件路径,不能直接传入图表对象。 - Matplotlib的
data.plot()返回的是Axes对象,必须调用.figure才能获取可保存的Figure实例。
内容的提问来源于stack exchange,提问作者runningbirds
相关产品推荐
相关产品推荐

