「Bokeh」のサーバ機能を使用してブラウザ上に表示したグラフに対して、凡例の表示・非表示を個別に切り替える二通りの方法を紹介します。
(凡例の表示・非表示の切り替えイメージ)
①クリックした凡例の表示・非表示
②チェックボックスで選択した凡例の表示・非表示
広告
動作確認済み環境
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以上が要求されています。
詳細は公式のリリース情報を参照してください。
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以上が要求されています。
詳細は公式のリリース情報を参照してください。
本記事で紹介する方法では、以下の記事で紹介しているソースコードをベースとして使用します。
「bokeh」での開発経験がない場合には、まずはこちらの記事を参照して、環境構築とグラフの表示方法について確認してください。
関連記事
Pythonの「Bokeh」というパッケージを使用して、ブラウザ上で指定した任意のデータをグラフ表示する方法を紹介します。 データはブラウザ上の入力ボックスから任意に変更可能で、GUIライクなボタン操作により、グラフの追加・削除を可能[…]
ソースコード
ソースコードはGitHub上で公開しています。
①クリックした凡例の表示・非表示
https://github.com/hotsmmr/DEV_BOKEH/blob/main/script/change_legend_visible_by_click.py
②チェックボックスで選択した凡例の表示・非表示
https://github.com/hotsmmr/DEV_BOKEH/blob/main/script/change_legend_visible_by_checkbox.py
※レイアウトや、グラフ表示部分は以下のソースコードをベースとしています。複数のグラフに対して個別にチェックボックス用のコールバック関数を定義できるように、プロット追加部分はクラス化しています。
凡例の表示・非表示
凡例をクリックする方法
- 対象とするグラフの「legend」フィールドを取得する
- 取得した「legend」フィールドの「click_policy」に「hide」を指定する
・「legend」フィールドの「click_policy」には、「none」「hide」「mute」が指定可能です。
※参考:bokeh.core.enums.LegendClickPolicy
※参考:bokeh.core.enums.LegendClickPolicy
(表示・非表示の切り替えイメージ)※input/data3.csvの「y=-2x」を非表示に切り替え
・クリックした凡例の表示は薄くなり、対応するプロットが非表示になります。
広告
チェックボックスで選択する方法
- 対象とするグラフの「legend」フィールドから凡例のリストを生成する
- 凡例のリストからチェックボックスを作成する
- チェックボックスのコールバック関数内で、非アクティブなボックスに対応する凡例を除外する
- チェックボックスのコールバック関数内で、非アクティブなボックスに対応するプロットを非表示にする
(①~②)
・「plot.legend.items」で取得できるリストの各要素は、
{“value”: (凡例の表示名), ”renderers”: (対応するプロットのレンダラー)}の辞書型で、「value」から凡例のリストを生成します。
・コールバック関数「__update_legend」は、チェックボックスのアクティブ/非アクティブ状況が変更された時に実行されるように、第一引数に「active」を指定します。
・プロットデータと同じクラス内にコールバック関数定義することで、プロットデータごとの内部変数をコールバック関数内で個別に操作できるようにします。
・「CheckboxGroup」オブジェクトの「labels」フィールドには、チェックボックスの表示名を文字列のリスト形式で設定します。
・「CheckboxGroup」オブジェクトの「active」フィールドには、アクティブにするチェックボックス(「labels」フィールド)のインデックスを指定します。
※参考:widgets.groups
{“value”: (凡例の表示名), ”renderers”: (対応するプロットのレンダラー)}の辞書型で、「value」から凡例のリストを生成します。
・コールバック関数「__update_legend」は、チェックボックスのアクティブ/非アクティブ状況が変更された時に実行されるように、第一引数に「active」を指定します。
・プロットデータと同じクラス内にコールバック関数定義することで、プロットデータごとの内部変数をコールバック関数内で個別に操作できるようにします。
・「CheckboxGroup」オブジェクトの「labels」フィールドには、チェックボックスの表示名を文字列のリスト形式で設定します。
・「CheckboxGroup」オブジェクトの「active」フィールドには、アクティブにするチェックボックス(「labels」フィールド)のインデックスを指定します。
※参考:widgets.groups
(③~④)
・コールバック関数「__update_legend」の第三引数(new)には、変更後のチェックボックスのアクティブ/非アクティブ状況がリスト形式で渡されます。
・アクティブ/非アクティブ状況のリストに含まれるインデックスに対応する凡例のみを表示、それ以外を非表示に設定します。
・凡例の表示については、「plot.legend.items」に残したい凡例のアイテムのみを含むリストを再設定します。
(bokehの2.4.2以降のバージョンでは、「plot.legend.items」の各要素の「visible」フィールドで表示(True)・非表示(False)を設定できます。)
・プロットの表示については、凡例に対応するレンダラー(「plot.legend.items」の「renderers」で取得)の「visible」フィールドで表示(True)・非表示(False)を設定します。
※参考:bokeh.models.annotations.LegendItem(bokeh==2.3.3)
※参考:bokeh.models.annotations.LegendItem(bokeh==2.4.2)
・アクティブ/非アクティブ状況のリストに含まれるインデックスに対応する凡例のみを表示、それ以外を非表示に設定します。
・凡例の表示については、「plot.legend.items」に残したい凡例のアイテムのみを含むリストを再設定します。
(bokehの2.4.2以降のバージョンでは、「plot.legend.items」の各要素の「visible」フィールドで表示(True)・非表示(False)を設定できます。)
・プロットの表示については、凡例に対応するレンダラー(「plot.legend.items」の「renderers」で取得)の「visible」フィールドで表示(True)・非表示(False)を設定します。
※参考:bokeh.models.annotations.LegendItem(bokeh==2.3.3)
※参考:bokeh.models.annotations.LegendItem(bokeh==2.4.2)
(表示・非表示の切り替えイメージ)※input/data3.csvの「y=-2x」を非表示に切り替え
・凡例をクリックする方法との違いは、凡例の表示が薄くなるか、完全に除外されるかの違いのみです。
・「plot.legend.items」を参照・更新することで、凡例の表示名を変更することも可能なため、こちらの方が拡張性は高くなります。
・「plot.legend.items」を参照・更新することで、凡例の表示名を変更することも可能なため、こちらの方が拡張性は高くなります。