ヒートマップはウェブページで多くクリックされた箇所や、地面や人体の温度変化を把握したいときに使われます。
D3.jsにはヒートマップを自動的にlayoutする機能は備えられていません。ということは、棒グラフと同じようにじぶんっで描画する処理を作成する必要があります。ですが、複雑な処理は必要なく、ヒートマップはデータに合わせて四角形を表示すればいいだけなので処理は単純です。
今回は、下記のように0~9の数値を配列に代入してをベースにしてヒートマップを表示します。
1 2 3 4 |
for( var i = 0 ; i < 96 ; i++){ // 0~9までの値のどれかを格納 arrData[i] = Math.floor( Math.random() * 10 ); } |
ヒートマップは色の変化により強さを表していますD3.jsで色を扱う方法については、これまでの記事で色々と出てきました。D3.jsに予め用意されているカラーを利用する方法や、予め自分で用意する方法がありました。今回は、D3.jsの
カラー補完機能を用いて色の変化を表現します。D3.jsには以下の表に示すカラー補間メソッドがあります。
メソッド | 説明 |
---|---|
d3.interpolateRgb(a,b) | aからbの色をRGBカラー空間で補間 |
d3.interpolateHsl(a,b) | aからbの色をHSLカラー空間で補間 |
d3.interpolateHcl(a,b) | aからbの色をHCLカラー空間で補間 |
d3.interpolateLab(a,b) | aからbの色をL*a*bカラー空間で補間 |
たとえば、d3.interpolateHsl("blue","yellow")と指定すると、青色から黄色に色を補間します。
d3.interpolateHsl("blue","yellow")と
d3.interpolateRgb("blue","yellow")としたとき、得られるカラー情報は異なります。
d3.interpolateHsl()メソッドは戻り値が関数なので、指定した数値に応じて色が計算されます。
サンプルコードの実行結果はこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<!DOCTYPE html> <head> <meta charset="utf-8"> <title>ヒートマップを作成してみる</title> <script src="../js/d3.js"></script> <style> svg{ width:160px; height:240px; border:1px solid black;} .block{ stroke:black; fill:none;} </style> </head> <body> <h1>ヒートマップの作成</h1> <svg id="graph"></svg> <script src="test.js"></script> </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
/* ヒートマップを表示 */ // HTMLファイルで設定した#graphの幅、高さを取得する var svgEle = document.getElementById("graph"); var svgWidth = getComputedStyle( svgEle, null) .getPropertyValue("width"); var svgHeight = getComputedStyle( svgEle, null) .getPropertyValue("height"); svgWidth = parseFloat( svgWidth ); // 整数に変換する svgHeight = parseFloat( svgHeight ); // 整数に変換する var blockSize = 20; var arrData = []; for( var i = 0 ; i < 96 ; i++){ // 0~9までの値のどれかを格納 arrData[i] = Math.floor( Math.random() * 10 ); } var maxVal = d3.max( arrData ); var color = d3.interpolateRgb("blue","yellow"); var heatMap = d3.select("#graph") .selectAll("rect") .data(arrData); heatMap.enter() .append("rect") .attr("class","block") .attr("x", function(d,i){ return ( i % 8 ) * blockSize; }) .attr("y", function(d,i){ return Math.floor( i / 8 ) * blockSize; }) .attr("width", function(d,i){ return blockSize; }) .attr("height", function(d,i){ return blockSize; }) .style("fill", function(d,i){ return color( d / maxVal ); }) /* setIntervalメソッドを合わせることで 定期的にヒートマップのデータを更新する */ setInterval(function(){ for( i = 0 ; i < arrData.length ; i++){ // -2 ~ 0 の値をnに代入する var n = ( (Math.random() * 3 ) | 0 ) - 2; arrData[i] = arrData[i] + n; if( arrData[i] < 0 ) arrData[i] = 0; if( arrData[i] > maxVal ) arrData[i] = maxVal; } // 更新したデータをセットする heatMap.data(arrData) .style("fill", function(d,i){ return color( d / maxVal ); }) },1000); |