技術は使ってなんぼ

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

【Streamlit】WEBアプリにグラフを作成しよう【matplotlib】


こんにちは。

今回も引き続きStreamlitを使ってWEBアプリを作っていきます。

Streamlitはpandas等のテーブルデータを扱うことに非常に長けている特徴を持っています。

実用面で考えると、テーブルを可視化する、いわゆるグラフ化の実装が重要となります。

これができるようになれば、毎回エクセルでグラフを作る面倒な作業が楽になる可能性があります。

特にエクセルファイルが複数あったとき、それらのファイルをひとつひとつ開いて毎回グラフを作成するのは面倒ですよね?

複数というのが5個ぐらいならまだ許せるかと思います。

これが10個、20個、となってくれば、それだけで数時間、下手すると1日潰れたりしてもう嫌になりますよね。

さらにグラフというのは、プレゼン等で一部拡大したり、表示する項目を減らしたり増やしたりという操作をするかと思います。

データが重いと作業や表示するのに時間がかかるし、思った通りの見栄えにならないとプレゼンがグダグダしたような経験ありませんか?

以上のように、ビジネスにおいてグラフ化をすることで困ったことがある人は、Streamlitを検討してみると良いかもしれません。

それではよろしくお願いします。

これからやること

公園検索WEBアプリの全体像をグラフ化する

前回作成した、公園検索WEBアプリを引き続き使っていきます。
yonesuke0716.hatenablog.com

読み込んだテーブルの実態を把握するため、可視化してみましょう。

横軸に公園名、縦軸に年齢の棒グラフを作成することを目的とします。

実装(シンプル)

matplotlibのインストール

実装の前に、グラフの描写に必要なmatplotlibというライブラリをインストールします。

いつものpip installしましょう。

$ pip install matplotlib

matplotlibのインストールが完了したら、test.pyに以下を続けてください。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.bar(df["公園"], df["年齢"])
st.pyplot(fig)

import文を除けば、わずか3行で棒グラフが作成できます。

これで可視化の準備はOKです。

では前回同様、streamlit run test.pyで実行します。

実行すると、以下のようなWEBページが表示されれば成功です。

シンプル版

しかしこれではあまりに簡素というか雑なグラフです。

もう少し表示の仕方を変更してみましょう。

matplotlibのfig, axについて

表示の仕方を変更するにあたって、fig, ax = plt.subplots() のfigとaxを理解する必要があります。

簡単に言うとグラフにおける図のオブジェクトをfig軸のオブジェクトがaxになります。

絵で表すと以下になりますので、ご存じない方はイメージを把握しておいてください。

matplotlibのオブジェクト指向イメージ

この絵は以下のサイトからの引用ですので、興味があれば参照ください。
matplotlib.org

これらを踏まえた上で、グラフの表示の仕方を変更します。

実装(表示修正版)

先ほどのソースコードを以下のように変更します。

import matplotlib.pyplot as plt

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)

何をやっているかというと、以下のような修正を行うものになります。
・set_ylimで縦軸を0~3の範囲で表示するよう修正
・set_yticksでy軸の感覚を0.5刻みだったものを1刻みに修正
・グラフタイトルに「公園と年齢」を表示
・x軸に「公園」、y軸に「年齢」と表示

さて、WEBページを更新してみましょう。

文字化け

タイトルと軸のラベル部分が正しく表示されておらず、□□として表示されています。

これは文字化けの現象であり、matplotlibで日本語テキストを入力すると良く起こる問題です。

この対策として、japanize_matplotlibというライブラリをインストールします。

japanize_matplotlib

こちらもpip installでOKです。

$ pip install japanize-matplotlib

そして、先ほどのソースコードを以下のように変更します。

import matplotlib.pyplot as plt
import japanize_matplotlib

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)

これで以下のように直るはずです。

文字化け解消

もしこれでも文字化けが解消されない場合、seabornをインストールする必要があります。

詳細はこちらのページのFAQをご確認ください。
pypi.org

私のgitには、seaborn対応のソースコードでアップしておきますので、seabornの対応方法を確認したい場合は、そちらも参照ください。
github.com

ちなみにseabornを使うとグラフの見た目も良くなるので、基本的にはmatplotlibを使う際はseabornは入れておくことをお勧めします。

seaborn

まとめと次の課題

さて、以上のように、Streamlitでグラフを簡単に作成することがわかりました。

またグラフの軸やタイトル等、見た目を変更することもできることがわかりました。

しかしこれでは使い勝手がいいとは言えません。

毎回見た目を調整するために、ソースコードを開いて修正をかけるのは大変ですよね。

理想はWEBページ上で自由に変更できるようにしたいですよね。

次回はこの続きとして、グラフの表示方法を動的に変更できるようにしてみたいと思います。