サイトアイコン アマチュア無線局JS2IIU

【Streamlit】可視化結果を画像として保存する機能

こんにちは、JS2IIUです。
今回の記事ではStreamlit上で表示しているグラフをPNGなどの画像形式でダウンロードできる様にする方法を説明していきます。今回もよろしくお願いします。

1. はじめに

Streamlitは、Pythonで簡単にインタラクティブなWebアプリを作成できる非常に便利なライブラリです。データ分析や機械学習の可視化に使われることが多く、作成したグラフを他の人と共有したい場面もよくありますよね。

本記事では、Streamlitで作成したグラフをPNG形式の画像として保存し、ダウンロードできる機能の作り方をステップバイステップで紹介します。

次のような場面に活用できます:

2. 使用するライブラリと準備

今回使う主なライブラリは以下の2つです:

以下のコマンドで必要なライブラリをインストールできます。

Bash
pip install streamlit matplotlib

3. Matplotlibで描いたグラフを画像として保存・ダウンロードする方法

ここからは、実際にグラフを作成し、PNG画像としてダウンロードできるアプリを作っていきましょう。

ステップ1:Streamlitアプリの基本構造を作る

まずは、Streamlitアプリの基本構造を用意します。

Python
import streamlit as st
import matplotlib.pyplot as plt
from io import BytesIO

ここでは、必要なモジュールをインポートしています。

ステップ2:Matplotlibでグラフを描く

以下のコードで、簡単な折れ線グラフを描きます。

Python
# グラフの作成
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というモジュールを使うことで、日本語フォントの文字化けを解消します。

Python
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形式の画像データに変換します。

Python
# BytesIOでメモリ上に画像データを保存
img_buffer = BytesIO()
fig.savefig(img_buffer, format='png')  # PNG形式で保存
img_buffer.seek(0)  # バッファの先頭に戻る

ここでは、画像ファイルをローカルに保存せず、メモリ上で保持してすぐにダウンロードできるようにしています。

ステップ4:画像のダウンロードボタンを設置する

最後に、Streamlitのst.download_buttonを使って、画像をダウンロードできるようにします。

Python
# ダウンロードボタンの表示
st.download_button(
    label="グラフをPNG形式でダウンロード",
    data=img_buffer,
    file_name="sample_graph.png",
    mime="image/png"
)

これで、ボタンをクリックするとsample_graph.pngというファイル名でグラフ画像をダウンロードできます。

🔄 ここまでのコードまとめ

以下が完成したStreamlitアプリの全体コードです。

Python
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という追加ライブラリが必要になります。

インストール

Python
pip install plotly kaleido

画像保存例(Plotly)

Python
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形式の画像として保存・ダウンロードする方法を紹介しました。

✅ ポイントのおさらい:

Streamlitアプリの機能をさらに拡張して、PDF保存や複数画像のZIPダウンロードなども将来的に挑戦してみるのもおすすめです。

7. 参考リンク

最後に書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。Poetryについても詳しく説明されています。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

モバイルバージョンを終了