こんにちは。今日はD3.jsでグラフや地図に色塗りする場合のお話です。

 

グラフや地図を値ごとに色分けするには、d3.scale.linear()を使うと簡単です。これは、値に対応した色を簡単に算出できるので便利です。具体例としては、

grad = d3.scale.linear().domain([0,1]).range(["#ff0000", "#0000ff"])

とすれば、

grad(0.5)
> #800080

という風に、赤と青の中間の色コードを出力してくれます。

 

ところが、ここで言う赤と青の中間は、RGBの3次元空間での中間を意味しています。視覚的に言えば、次の画像のラインが値域であり、grad(0.5)はライン中央に位置する色ですね。
RGB Interpolation

 

でも、赤〜青の範囲で色を使うときに、色相で補完したい場合もありますよね。というか、こっちの方が一般的には需要あるのではないでしょうか。

 

Hue Interpolation

 

円周方向が色相(Hue)です。例えば、Max:赤から Min:青と指定すれば、入力値に応じて赤>橙>黄>緑>青って感じで、色を使えるようにしたい訳です。

 

そのためには、

RGB16進数→RGB色系→HSV色系の順に変換して、HSV色系の中でd3.scale.linear()で補完処理を行い、結果をRGB色系に再度変換してattribute指定に使うようにします。HSV色空間とは何ぞや?という方は、Wikipediaへ。

 

それぞれの変換を行うスクリプトを書いてみました。

 

厳密には、黒(R,G,B)=(0,0,0)の場合のHSV色空間におけるHの値は不定/undefinedなのですが(黒は彩度ゼロってことです)、ここのコードではゼロを割り当ててしまっています。それでも、今回の目的の実用上問題なさそうだったからです。

 

次回はHSV色系で色補完して、グラフor地図を色分けした具体例を紹介しようと思います。

それではまた♪