こんにちは、JS2IIUです。
今回の記事ではStreamlit上で表示しているグラフをPNGなどの画像形式でダウンロードできる様にする方法を説明していきます。今回もよろしくお願いします。
1. はじめに
Streamlitは、Pythonで簡単にインタラクティブなWebアプリを作成できる非常に便利なライブラリです。データ分析や機械学習の可視化に使われることが多く、作成したグラフを他の人と共有したい場面もよくありますよね。
本記事では、Streamlitで作成したグラフをPNG形式の画像として保存し、ダウンロードできる機能の作り方をステップバイステップで紹介します。
次のような場面に活用できます:
- チームメンバーやクライアントとグラフを共有したいとき
- レポートやプレゼン資料にグラフを貼り付けたいとき
- Webアプリから画像として結果を保存したいとき
2. 使用するライブラリと準備
今回使う主なライブラリは以下の2つです:
Streamlit:Webアプリ作成のためのライブラリMatplotlib:グラフ描画のための定番ライブラリ
以下のコマンドで必要なライブラリをインストールできます。
pip install streamlit matplotlib3. Matplotlibで描いたグラフを画像として保存・ダウンロードする方法
ここからは、実際にグラフを作成し、PNG画像としてダウンロードできるアプリを作っていきましょう。
ステップ1:Streamlitアプリの基本構造を作る
まずは、Streamlitアプリの基本構造を用意します。
import streamlit as st
import matplotlib.pyplot as plt
from io import BytesIOここでは、必要なモジュールをインポートしています。
matplotlib.pyplot:グラフ描画用BytesIO:メモリ上に画像を一時保存するためのモジュール(ファイルを一時的に扱うために使います)
ステップ2:Matplotlibでグラフを描く
以下のコードで、簡単な折れ線グラフを描きます。
# グラフの作成
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 20, 15, 30])
ax.set_title("サンプルグラフ")
ax.set_xlabel("X軸")
ax.set_ylabel("Y軸")
# Streamlitでグラフを表示
st.pyplot(fig)このコードでは、ax.plot()で折れ線グラフを作り、st.pyplot()でStreamlit上に表示しています。
ここで、matplotlibのラベルが文字化けしてしまった、という場合はこちらの記事を参考にしてください。japanize_matplotlibというモジュールを使うことで、日本語フォントの文字化けを解消します。
import japanize_matplotlib # ← この1行を追加するだけ!
# グラフの作成
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 20, 15, 30])
ax.set_title("サンプルグラフ")
ax.set_xlabel("X軸")
ax.set_ylabel("Y軸")
# Streamlitでグラフを表示
st.pyplot(fig)ステップ3:PNG形式の画像に変換して保存
次に、このグラフをPNG形式の画像データに変換します。
# BytesIOでメモリ上に画像データを保存
img_buffer = BytesIO()
fig.savefig(img_buffer, format='png') # PNG形式で保存
img_buffer.seek(0) # バッファの先頭に戻るここでは、画像ファイルをローカルに保存せず、メモリ上で保持してすぐにダウンロードできるようにしています。
ステップ4:画像のダウンロードボタンを設置する
最後に、Streamlitのst.download_buttonを使って、画像をダウンロードできるようにします。
# ダウンロードボタンの表示
st.download_button(
label="グラフをPNG形式でダウンロード",
data=img_buffer,
file_name="sample_graph.png",
mime="image/png"
)これで、ボタンをクリックするとsample_graph.pngというファイル名でグラフ画像をダウンロードできます。
🔄 ここまでのコードまとめ
以下が完成したStreamlitアプリの全体コードです。
import streamlit as st
import matplotlib.pyplot as plt
import japanize_matplotlib # ← この1行を追加するだけ!
from io import BytesIO
# グラフを作成
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 20, 15, 30])
ax.set_title("サンプルグラフ")
ax.set_xlabel("X軸")
ax.set_ylabel("Y軸")
# Streamlitでグラフ表示
st.pyplot(fig)
# グラフ画像をメモリに保存
img_buffer = BytesIO()
fig.savefig(img_buffer, format='png')
img_buffer.seek(0)
# ダウンロードボタン
st.download_button(
label="グラフをPNG形式でダウンロード",
data=img_buffer,
file_name="sample_graph.png",
mime="image/png"
)4. Plotlyを使った画像保存(補足)
Plotlyを使っている場合は、画像として保存するためにkaleidoという追加ライブラリが必要になります。
インストール
pip install plotly kaleido画像保存例(Plotly)
import streamlit as st
import plotly.express as px
import plotly.io as pio
from io import BytesIO
# グラフ作成
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")
# 表示
st.plotly_chart(fig)
# 画像保存(kaleidoを使用)
img_bytes = pio.to_image(fig, format="png")
img_buffer = BytesIO(img_bytes)
# ダウンロードボタン
st.download_button(
label="PlotlyグラフをPNGでダウンロード",
data=img_buffer,
file_name="plotly_graph.png",
mime="image/png"
)5. よくあるエラーとその対処法
❌ fig.savefig()でエラーが出る
→ figが正しく作られていない場合に起こります。plt.subplots()で作成したオブジェクトを使っているか確認しましょう。
❌ st.download_buttonで画像がダウンロードできない
→ BytesIOのバッファがseek(0)で先頭に戻っていないと、データが正しく読み取れません。必ずseek(0)を入れてください。
❌ Plotlyで画像が保存できない
→ kaleidoが未インストールの場合に発生します。pip install kaleidoでインストールしてください。
6. まとめ
本記事では、Streamlitを使って作成したグラフをPNG形式の画像として保存・ダウンロードする方法を紹介しました。
✅ ポイントのおさらい:
- Matplotlibの
savefig()を使って画像として保存 BytesIOでメモリ上に保存し、st.download_buttonでダウンロード可能に- Plotlyを使う場合は
kaleidoが必要
Streamlitアプリの機能をさらに拡張して、PDF保存や複数画像のZIPダウンロードなども将来的に挑戦してみるのもおすすめです。
7. 参考リンク
- Streamlit 公式ドキュメント – download_button
- Matplotlib 公式ドキュメント – savefig
- Plotly 公式ドキュメント – Static Image Export
最後に書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。Poetryについても詳しく説明されています。ぜひ手に取ってみてください。
最後まで読んでいただきありがとうございます。

