Kibana 8.13以降でグラフの色をカスタマイズする方法

この記事は[Elastic Stack (Elasticsearch) Advent Calendar 2024](https://qiita.com/advent-calendar/2024/elasticsearch)の21日目の記事です。

Kibanaのグラフの色をカスタマイズする方法をGoogle検索したところ、やり方が引っかからなかったので簡単に紹介してみようと思います。

本記事では、Kibana 8.13以降で導入された新しいColor Mapping機能を使った、グラフの色カスタマイズ方法を解説します。満足度調査アンケートの例を使って、色の印象や目的に応じたグラフ配色の考え方も紹介します。
なお、グラフ作成の細かい手順は紹介しませんが、あらかじめ用意したサンプルデータもAppendixに記載し、それをもとに解説します。手元の環境で再現したい方はそちらを参照ください。

## はじめに

「後輩くん、最近Kibanaでデータ可視化しはじめたって？」
「そうなんですよ、今アンケート結果のダッシュボード作ってまして…見てください！」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/5903d002-992d-6816-21a1-158cdf34e413.png)

「おっ、いいねぇ。**数量の比較は棒グラフを使う、2〜3個の数値割合の比較は円グラフを使う**、とデータ可視化の基本も守れてるじゃないか。」
「以前教えてもらいましたからね。それぐらいできますよ。」
「でも、まだまだ良くできるよ。今回のアンケートは2択だったり5段階評価で答えるような**選択肢の良し悪しがはっきりとしたデータ**だよね？それならこんな感じで配色を工夫すると…」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/5579d78c-a87a-c187-93b7-406c50b48ce8.png)

「あっ、最初のダッシュボードより**一瞬見ただけで意味を把握しやすくなった**気がします！良い印象の選択肢は青寄りで、悪い印象の選択肢は赤寄りにされてるんですよね。」
「その通り、色の印象をよく把握してるね。もしかして元々グラフの配色を変えたいとは思ってた？」
「そうなんですよ、でもKibanaでの配色の変え方が分からなくて…」
「OK。じゃあKibanaでの配色の変え方を教えようか。」

## 結論

Color Mappingの設定で、`Use the new Color Mapping feature`のチェックを入れ、`Color assignments`で「この値の時はこの色で表示する」をカスタマイズすればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/e5eed530-5a6f-9fec-8eb3-7201a710e529.png)

## 動作確認した環境
- Elasticsearch 8.17.0
- Kibana 8.17.0

※8.13以降であれば同様に動作するかと思われます。

## 色をカスタマイズする手順
### 1. 配色を変更したい設定の詳細画面を開く
Visualizationの編集画面でカラーマップの表示が出ている選択肢をクリックします

![スクリーンショット 2024-12-21 16.31.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/2d190714-b73a-a10d-896c-b014ede2f9c5.png)

※カラーマップとは以下が表示されていることを指します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/66c19d69-2acf-3921-dc47-bf9c1aa97532.png)

### 2. 色設定画面を開く
遷移先のサイドメニューの最下部にある`Color mapping`から`Edit colors`をクリックします
![スクリーンショット 2024-12-21 16.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/b876f359-0347-7dfa-5386-b22616f27309.png)

### 3. それぞれの値に対応した色設定を追加する
`Use the new Color Mapping feature`にチェックが入っていることを確認し、`Add all unassigned terms`をクリックします
![スクリーンショット 2024-12-21 16.37.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/ba594943-013e-5e89-219f-491fc1140cf4.png)

すると、それぞれに対応したカラー設定が追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/cadddf37-746c-0652-0c2a-840f2de87b17.png)

:::note info
ちなみに、この段階でModeをGradientに変更すると、簡単にグラデーションを設定できます。グラデーションを設定したい場合は個別に設定するよりもこちらの方が便利なのでぜひ使いましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/1fc2af5e-22ea-c185-834e-4e8035e091b7.png)
:::


### 4. 色を変更する
色を変更したいカラーの色をクリックし、色を変更します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/7671a87d-5c14-44bf-6185-550541afcb9d.png)

ここで`Palette colors`や`Neutral colors`から用意された色を選んでも良いですが、今回は完全に色をカスタムしてみましょう。
`Custom`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/7883f2d5-d812-639a-85df-da2bb79ca04b.png)

色領域から望みの色をクリックするか、カラーコードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/13fe93cf-8b33-8abe-b70b-8b2ae75f15d9.png)

すると、色の変更が即座にグラフへ反映されます。

### 5. 全ての色を変更し、保存する
ここまでの手順を繰り返し、全ての値の色を変更します。
今回は以下のような配色にしました。

- <font color="#3499DD">**非常に満足している: #3499DD**</font>
- <font color="#19BC9D">**やや満足している: #19BC9D**</font>
- <font color="#F3C40F">**どちらともいえない: #F3C40F**</font>
- <font color="#E67E22">**あまり満足していない: #E67E22**</font>
- <font color="#E74C3C">**全く満足していない: #E74C3C**</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/2d584ac5-0189-cf10-02df-650694df5cfe.png)

全ての変更が完了したら、画面右上の`Save and return`をクリックし、保存します。
![スクリーンショット 2024-12-21 17.03.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/777a0974-44ee-9b06-bbd6-a27e9701a8ed.png)

グラフの色をカスタマイズする方法は以上です。

:::note info
グラフ編集画面上部の設定で値を棒グラフに直接表示できるオプションも便利です。細かい値を一瞬で把握したいときは設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/75e4f864-6aed-8de0-ebab-431f6e69ce36.png)
:::

:::note info
例として見せた円グラフもほぼ同様の手順で色をカスタマイズしました。
細かく設定した以外の色（今回は「はい」「いいえ」以外の値）をどの色で表示するかは画像赤枠の箇所で設定できるので、ここも設定しておくと良いでしょう。
![スクリーンショット 2024-12-21 17.10.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/ad80c610-6637-2542-4a22-d2b1840243be.png)
:::

## おわりに
「なるほど、こうやればできたんですね！ありがとうございます。個人的には先輩の色は派手に感じるのでコレぐらいが良いかな…」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/ff46bc9f-7439-f4ce-0760-43a5e212222c.png)

「うん、その辺りは個人的なグラフであれば好みやベストプラクティスに則るのが良いだろうね。一方で、利用目的がはっきりしたグラフであれば、それが分かるようにしたほうが良いかもしれないよ。」
「利用目的…ですか」
「そう。例えば満足度が高い値にしか興味がないのであればこういう配色もありだろうし…」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/38b8541d-5c7d-669c-979f-918bdead6041.png)

「満足度が低い値にしか興味がないのであればこういう配色もありかもしれない。」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/daa4e2cc-1564-5bd8-9552-67d0065d2ca6.png)

「このデータ、このグラフ形式では微妙な例[^1]だったかもしれないけど、それぞれの配色で注目した箇所が変わったんじゃないかな？**一目見て、目的に即した内容が分かるダッシュボードを目指すには必要な観点**だと思う。また、**不特定多数の人が使う場合は色覚異常の人でも区別可能な配色になっているか**[^2]も重要だね。」
「なるほど…今回も学びになりました！また何かあったら他のデータ可視化の考え方も教えてください！」
「おうよ、じゃあ俺は帰ってPath of Exile 2やるから」
「あっ、自分まだアセンダンシーポイントまだ全部取れてないんですよ！手伝ってもらえません？」
「悪いけど俺はマッピングで忙しいから…お疲れ〜」
「そんな〜」

[^1]: リッカート尺度の設問は100%積み上げ横棒グラフで設問を並べて可視化するのが一般的と思います。今回は複数の設問のデータを準備するのが面倒だったのでシンプルに横棒グラフを並べることにしました。
[^2]: Kibanaのデフォルト配色として選択できるものはこの辺りが基本的に考慮されています。自分で配色を考える時に気をつけよう、という話です。

## 本当のおわりに
全てのグラフに適用するには少し時間はかかるかもしれませんが、**グラフごとに色をGUI上から気軽にカスタマイズできるのはかなり便利**と感じました。
また、グラフ自体を複製すればColor Mappingの設定も引き継がれるため、**複数作る際は複製すると効率的に作れそう**です。
色のカスタマイズが大変なためにバージョンアップを見送ってきた環境があるのですが、これを機にバージョンアップを検討してみようかと思いました！

本記事は以上です。[Elastic Stack (Elasticsearch) Advent Calendar 2024](https://qiita.com/advent-calendar/2024/elasticsearch)には他にも様々なElastic Stackに関連した記事が投稿されています！ぜひ読んでみてください。

## Appendix
### 事前手順としてどのようなことをしてグラフを作ったか
:::note warn
本記事では事前準備としてグラフを作るまでの詳細な手順は紹介しませんが、参考までに色を変更する前のグラフを作成した流れをメモしておきます。
:::

まず、Dev ToolsのConsoleで以下のコマンドを実行し、可視化するためのドキュメントを格納しました。

```json
POST _bulk
{ "index" : { "_index" : "questionnaire", "_id" : "1" } }
{ "answer.name" : "非常に満足している", "answer.quantity" : 10, "answer.priority": 1}
{ "index" : { "_index" : "questionnaire", "_id" : "2" } }
{ "answer.name" : "やや満足している", "answer.quantity" : 35, "answer.priority": 2}
{ "index" : { "_index" : "questionnaire", "_id" : "3" } }
{ "answer.name" : "どちらともいえない", "answer.quantity" : 25, "answer.priority": 3}
{ "index" : { "_index" : "questionnaire", "_id" : "4" } }
{ "answer.name" : "あまり満足していない", "answer.quantity" : 20, "answer.priority": 4}
{ "index" : { "_index" : "questionnaire", "_id" : "5" } }
{ "answer.name" : "全く満足していない", "answer.quantity" : 10, "answer.priority": 5}

POST _bulk
{ "index" : { "_index" : "event-participation", "_id" : "1" } }
{ "answer.name" : "はい", "answer.quantity" : 70, "answer.priority": 1}
{ "index" : { "_index" : "event-participation", "_id" : "2" } }
{ "answer.name" : "いいえ", "answer.quantity" : 20, "answer.priority": 2}
{ "index" : { "_index" : "event-participation", "_id" : "3" } }
{ "answer.name" : "その他", "answer.quantity" : 10, "answer.priority": 3}
```

前者が棒グラフ用のインデックス、後者が円グラフ用のインデックスです。

その後、`questionnaire`と`event-participation`に対応するData Viewをそれぞれ作成しました。

最後に、ダッシュボードを作成し、それぞれのインデックスに対応したVisualizationを作成しました。

### テーブルの配色変更について
これまではテーブルの配色変更は数値フィールドにしかできませんでしたが、Kibana 8.16から文字列値にも色をつけられるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264679/1d6982b9-abec-cb22-7234-611b75fbe1e6.png)
(画像引用: https://www.elastic.co/guide/en/kibana/8.16/whats-new.html#_color_text_values_in_tables)

Kibanaダッシュボードを提案するときに「エクセルのみたいな表示で、条件付き書式とかできないの？」と言われた経験がある方、何人もいらっしゃると思うんですが、それに対する答えが使えるようになっています。

---

以降は、それなりにKibanaを使ってる方向けのおまけ話をまとめました。

### visualization:colorMappingについて
以前はLens以外のVisualizationに対してはAdvanced Settingの`visualization:colorMapping`にJSONで設定することで、対応する値の配色を変更できました。

しかし、この設定値で変更を反映できるのは昔のAggregation BasedとTSVBのVisualizationのみで、現在メインで使われるLensのVisualizationには反映できませんでした。

そして、最近は前述の新しいColor Mappingの仕組みができたことで役目を終えたと判断され、最新のリポジトリでは遂にこの設定値も削除されました。

https://github.com/elastic/kibana/pull/197802

Kibanaの次のメジャーバージョンであるv9.0.0からこの変更が反映されます。現在この設定値を使ってAggregation BasedやTSVBのVisualizationの配色をカスタマイズされている方はv9.0.0に移行する際には新しいColor Mappingに移行する必要があることに注意してください。

### Color Mappingの実装状況について
今回の記事で紹介したColor Mappingは現時点ではTech Preview段階です。
実装状況は随時以下のIssueで共有されているようなので、気になる方はぜひ覗きに行ってみてはいかがでしょうか。
https://github.com/elastic/kibana/issues/167506