You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:52:45