技術は使ってなんぼ

自分が得たものを誰かの役に立てたい

【Streamlit】グラフを動的に変化させて、ダッシュボードを作ろう【matplotlib】


こんにちは。

前回に引き続き、Streamlitのグラフ作成について紹介していきます。

yonesuke0716.hatenablog.com

今回はより実用性を考えて、グラフを動的に変化させられるようにしてみましょう。

具体的には、グラフの縦軸や横軸を選択できるようにしたり、チェックボックスを実装して表示・非表示を選べるようにします。

こうすることで、今までエクセルで細かく調整をしていたものが、グラフィカルに簡単に調整できるようになります。

これによりプレゼン等の資料作成でかかっていた時間が一気に解消するかもしれません。

プレゼン時も顧客の要望をリアルタイムで可視化することができるため、便利なダッシュボードを作ることができます

実際に作成したものを眺めるのが一番わかりやすいかと思うので、さっそくやっていきましょう。

グラフを表示・非表示できるようにする(チェックボックスの実装)

チェックボックスの実装はこちら
docs.streamlit.io

それではtest.pyも修正していきましょう。

is_graph = st.checkbox('年齢をグラフ化する')
if is_graph:
    fig, ax = plt.subplots()
    ax.bar(df["公園"], df["年齢"])
    ax.set_ylim([0, 3])
    ax.set_yticks([0, 1, 2, 3])
    ax.set_title("公園と年齢")
    ax.set_xlabel("公園")
    ax.set_ylabel("年齢")
    st.pyplot(fig)

追加したのはis_graphです。

st.checkboxはチェックボックスにチェックが入れられるとTrue、入ってないとFalseが渡されます。

つまり上記のコードで、チェックボックスにチェックを入れた時だけ、グラフが表示されるというわけです。

それではこれで「streamlit run test.py」実行してみましょう。

チェックボックス実装

空白のチェックボックスが表示され、グラフが非表示になりました。

ではこのチェックボックスをクリックしてチェックをいれてみましょう。

グラフが表示されました

うまく表示できましたね。

縦軸・横軸の表示を変化させてみる

続いて縦軸の上限値を変更できるようにしてみましょう。

ソースコードは以下のように記述します。

is_graph = st.checkbox('年齢をグラフ化する')
if is_graph:
    max_age = st.slider('年齢の上限', 0, 5, 3)
    age_ticks = range(max_age + 1)
    fig, ax = plt.subplots()
    ax.bar(df["公園"], df["年齢"])
    ax.set_ylim([0, max_age])
    ax.set_yticks(age_ticks)
    ax.set_title("公園と年齢")
    ax.set_xlabel("公園")
    ax.set_ylabel("年齢")
    st.pyplot(fig)


ポイントはstreamlitのsliderを使用しています。
docs.streamlit.io

これを使うとスライドバーが表示されて、数字をGUI的に操作することができます。

スライダーで選択した数字を、グラフの軸の上限値にしています。

それでは実行結果をみてみましょう。

y軸のslider

上限を5、デフォルト値を3にしたので、設定どおり表示されてますね。

ではスライドバーを動かしてみます。

上限が変わりました!

スライドバーを2に動かしてみましたが、グラフのy軸の上限も2に変わりました。

これで画面上で自由にグラフの表示形式を変更できます。

では次に横軸も見てみましょう。

こちらも表示したい公園だけを表示するようにしたいとします。

先ほどと異なり、数字ではなく文字列ですね。

この場合、どうやって実現すればよいでしょうか?

一度ここで少しだけ考えてみてください。


どうでしょうか?


なんとなくイメージだけでも想像できたでしょうか?


それでは回答例として、私だったらこんな感じでやってみました。

streamlitのmultiselecterを使います。
docs.streamlit.io

コードは以下のようにします。

is_graph = st.checkbox('年齢をグラフ化する')
if is_graph:
    max_age = st.slider('年齢の上限', 0, 5, 3)
    age_ticks = range(max_age + 1)
    
    park_list = df["公園"].to_list()
    select_park = st.multiselect('表示する公園名を選択', park_list, park_list[0])
    df = df[df['公園'].isin(select_park)]
    
    fig, ax = plt.subplots()
    ax.bar(df["公園"], df["年齢"])
    ax.set_ylim([0, max_age])
    ax.set_yticks(age_ticks)
    ax.set_title("公園と年齢")
    ax.set_xlabel("公園")
    ax.set_ylabel("年齢")
    st.pyplot(fig)

公園の値を一度リスト化し、それをmultselectから選択できるようにします。

選択した値はselect_parkという変数にリストとして格納されます。

後はdataframeをselect_parkと一致するものだけ表示するようにすればよいのです。

この時、dataframeのisinというメソッドを使用するのがポイントです。

こうすることで、df["公園"]の値が、select_parkのリストに一致するものだけのdfを作成することができます。

それでは実行結果をみてみましょう。

x軸の変更

では他にも選択するとどうなるでしょうか?

成功!

表示したい公園名だけ選択して表示できるようになりました!

このように、WEBブラウザ上でグラフを動的に変化させることができます。

いかがだったでしょうか?

このように動的に変化させられるようになったことで、よりダッシュボードとしても使えるのではないでしょうか?

ぜひ様々なアレンジを加えて、オリジナルのダッシュボードを作ってみてください!

githubもいつものように更新しておきますので、ご自由にご覧ください。
github.com

おまけ(参考図書)

今回はPythonでゲームを作ってみたいという方向けの書籍をご紹介します。

私も一通り読みましたが、とても作りが凝っていて解説が分かりやすい良書なのでおススメです。

ゲームのみならず、画像データに関する開発やデスクトップアプリを開発する上でも役に立つ考え方を学べます。