【Python × Bokeh】入力ボックス内のデータのグラフ表示、任意追加・削除

Pythonの「Bokeh」というパッケージを使用して、ブラウザ上で指定した任意のデータをグラフ表示する方法を紹介します。

データはブラウザ上の入力ボックスから任意に変更可能で、GUIライクなボタン操作により、グラフの追加・削除を可能としています。「Bokeh」にはサーバー機能が備わっているため、常駐型システムに関する経験がなくとも容易に開発が可能です。

広告

 

(グラフの追加イメージ)

load_data

 

(グラフの削除イメージ)

remove_data

 

 

 

動作確認済み環境


OS: Windows 10 Home (64bit)
CPU: Intel Core i7-9750H
その他のプラットフォーム: Anaconda3(python3.8)
Pythonパッケージ: bokeh==2.2.3, pandas==1.1.3
※bokehの2.0.0以降のバージョンではpython3.6以上、2.4.0以降のバージョンではpython3.7以上が要求されています。
詳細は公式のリリース情報を参照してください。
本記事で紹介する方法では、Anaconda3がインストール済みであることを前提としています。
未インストールの場合は、以下のページを参考に、事前にインストールしてください。
関連記事

Anacondaは、Pythonインタプリタ(実行環境)と、科学技術計算、データサイエンス、機械学習に関連したパッケージがセットになったプラットフォーム環境です。本記事では、Anaconda環境をWindowPCへインストールする方法と簡単[…]

eye_catch
広告

必要パッケージのインストール


bokeh

「pip」でインストールする方法も公式ページの「first_steps」で紹介されていますので、お使いの環境に合わせてパッケージをインストールしてください。

 

アプリケーション概要


ソースコード

アプリケーションのソースコードはGitHubで公開しています。

ソースコードはこちら

実行方法

「bokeh serve」でPythonスクリプトを指定すると、 Pythonスクリプトを常駐させた状態でアプリケーションを起動できます。
「–show」 を指定すると、既定のブラウザが自動で立ち上がり、Pythonスクリプト内で定義したレイアウトが表示されます。

機能概要

①データのルートパスの入力受付

入力ボックス「root path:」にデータファイル(*.csv)が含まれるフォルダのルートパスを指定すると、ルートパス配下のデータファイルを再帰的に検索する。
検索により見つかったデータファイルは「Load」ボタン横のセレクトボックスにリストアップされる。

input_root_path

 

②指定したデータのロード、グラフ表示

「Load」ボタン横のセレクトボックスからデータファイルを選択し、「Load」ボタンを押下すると、グラフが1つ追加される。
グラフ名は「{表示順序}_{ファイル名}」に自動で設定される。
同じデータを複数回に渡ってグラフ化することも可能としている。
「ALL Load」ボタンを押下すると、「Load」ボタン横のセレクトボックスにリストアップされている全てのデータファイルがグラフ化される。
追加されたグラフは「Remove」ボタン横のセレクトボックスにリストアップされる。
横方向のグラフ表示数は最大数4つに設定している。5つ目以降のグラフは2行目以降に表示される。

load_data

 

③指定したグラフの削除

「Remove」ボタン横のセレクトボックスからデータファイルを選択し、「Remove」ボタンを押下すると、選択したグラフが削除される。
削除したグラフ以降に表示していたグラフのグラフ名と表示位置は最新の表示順序に応じて自動的に調整される。
「ALL Remove」ボタンを押下すると、「Remove」ボタン横のセレクトボックスにリストアップされている全てのグラフが削除される。
remove_data
広告

プログラミング方法


以下の順序でプログラミングします。

  1. オブジェクトのインポート
  2. ウィジェットの定義
  3. コールバック関数の定義
  4. ウィジェット上の操作とコールバック関数の紐づけ
  5. レイアウトの定義

 

オブジェクトのインポート

作成するアプリケーションの概要に合わせて必要なオブジェクトをインポートします。「任意」と補足したものは、画面レイアウトやプロットのデザイン、搭載するウィジェットに依存するものですので、必須ではありません。

レイアウト関連 curdoc
column ※任意
row ※任意
データプロット関連 figure
ColumnDataSource
Spectral4 ※任意
ウィジェット関連 TextInput ※任意
Select ※任意
Button ※任意

参考: 公式のreference

 

ウィジェットの定義

アプリケーションに搭載したい機能に応じて、必要なウィジェットを定義します。

変数名 データ型
(オブジェクト名)
対応する機能概要 表示イメージ
root_path_input TextInput ①データのルートパスの入力受付 widget_text_input
file_list Select ①データのルートパスの入力受付
②指定したデータのロード、グラフ表示
widget_select
plot_list Select ②指定したデータのロード、グラフ表示
③指定したグラフの削除
widget_select
all_load_button Button ②指定したデータのロード、グラフ表示 widget_all_load
load_button Button ②指定したデータのロード、グラフ表示 widget_load
all_remove_button Button ③指定したグラフの削除 widget_all_remove
remove_button Button ③指定したグラフの削除 widget_remove

参考: 公式のuser_guide

広告

コールバック関数の定義

ウィジェット上で実施されたユーザ操作をトリガとして、コールされる関数の処理内容を定義します。

(関数インターフェール)

(データプロット部分のみの抜粋)

関数名
実行条件
処理概要
search_data_from_input_path
「root_path_input」で定義した入力ボックスへの文字列(ルートパス)の入力 入力されたルートパス配下のデータファイルを再帰的に検索する。
検索により見つかったデータファイルを「Load」ボタン横のセレクトボックスにリストアップする。
set_load_target
「file_list」で定義したセレクトボックス内の文字列(ファイル名)を選択 選択したファイル名を内部変数に格納
set_remove_target
「plot_list」で定義したセレクトボックス内の文字列(グラフ名)を選択 選択したグラフ名を内部変数に格納
all_load_data 「all_load_button」で定義したボタンの押下 「file_list」で定義したセレクトボックス内の全ての文字列を入力として、「load_data」関数を実行
load_data
「load_button」で定義したボタンの押下 「set_load_target」で選択したファイルをパースしてグラフ表示する
all_remove_data
「all_remove_button」で定義したボタンの押下 「plot_list」で定義したセレクトボックス内の全ての文字列を入力として、「remove_data」関数を実行
remove_data
remove_button」で定義したボタンの押下 「set_remove_target」で選択したグラフを削除する
各関数の詳細ロジックは、GitHubのソースコードおよびコメント内容からご確認ください。

 

ウィジェット上の操作とコールバック関数の紐づけ

各ウィジェット用のオブジェクトには、コールバック関数の紐づけ用のメソッドが定義されています。このメソッドにコールバック関数を指定することで、ウィジェット上の操作とコールバック関数を紐づけることができます。

オブジェクト名 紐づけ用のメソッド 処理概要 reference
TextInput on_change 第一引数で指定したフィールド名「’value’」が変更された際に、第二引数で指定したコールバック関数が実行される。
TextInputの「’value’」フィールドには入力ボックス内の文字列が設定されている。
コールバック関数実行時の引数には以下が渡される。
・第一引数(attrname): 変更されたフィールド名
・第二引数(old): 変更前の文字列
・第三引数(new): 変更後の文字列
Select on_change 第一引数で指定したフィールド名「’value’」が変更された際に、第二引数で指定したコールバック関数が実行される。
Selectの「’value’」フィールドにはセレクトボックス内で選択した文字列が設定されている。
コールバック関数実行時の引数には以下が渡される。
・第一引数(attrname): 変更されたフィールド名
・第二引数(old): 変更前の文字列
・第三引数(new): 変更後の文字列
Button on_click ボタン押下時に、第一引数で指定したコールバック関数が実行される。

 

レイアウトの定義

ウィジェットやプロットを任意に配置したレイアウトを定義します。row()内のウィジェットは横方向、column内のウィジェットは縦方向に自動整列されます。

curdoc()で取得したドキュメントにレイアウトを追加することで、ブラウザ表示と、ウィジェット上の操作をリアルタイムに検出することが可能になります。

グラフはコールバック関数「load_data」内でドキュメントに追加します。
広告