D3.jsは表示処理は行わないため、SVG、canvasだけではなく、HTMLのdiv要素を使いグラフを表示することができます、ヒートマップもdiv要素を表示することができます。ヒートマップのような単純なものであれば、SVGよりdiv要素のほうが簡単です。
最初に、スタイルシートでヒートマップの四角形の幅、高さを設定する。
1 2 3 4 5 6 7 8 9 10 |
#graph{ position:absolute; top:80px; left:20px; } #graph div{ position:absolute; width:20px; height:20px; } |
D3.jsでdiv要素の表示位置と背景色を設定し安栖。表示位置を表す座標ですが、div要素のときは、X座標を指定する場合はスタイルシートのleftプロパティ、Y座標を指定する場合はスタイルシートのtopプロパティです。値は"px"という単位を付します。塗り潰す色は背景色を指定するbackground-colorプロパティで色を指定します。
サンプルコードの実行結果はこちら
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 |
<!DOCTYPE html> <head> <meta charset="utf-8"> <title>ヒートマップをDOMに表示する</title> <script src="../js/d3.js"></script> <style> #graph{ position:absolute; top:80px; left:20px; } #graph div{ position:absolute; width:20px; height:20px; } .block{ stroke:black; fill:none;} </style> </head> <body> <h1>ヒートマップをdiv要素で表示</h1> <div 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 67 |
/* ヒートマップをDOMに表示する */ d3.text("test.csv",function(error,data){ // 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 = []; /* test.txtを読み込んだ時の処理はここで行う */ // ","で分割した情報を格納 var temp = data.split(","); for(var i = 0 ; i < temp.length ; i++){ arrData[i] = parseInt( temp[i] ); } var maxVal = d3.max( arrData ); var color = d3.interpolateRgb("blue","yellow"); var heatMap = d3.select("#graph") .selectAll("div") .data(arrData); heatMap.enter() .append("div") .attr("class","block") .style("left", function(d,i){ return ( i % 8 ) * blockSize + "px"; }) .style("top", function(d,i){ return Math.floor( i / 8 ) * blockSize + "px"; }) .style("background-color", function(d,i){ return color( d / maxVal ); }); 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("background-color", function(d,i){ return color( d / maxVal ); }) },1000); }); |
1 2 3 4 5 6 7 8 9 10 11 12 |
3,9,8,2,3,5,4,4, 4,5,3,7,8,6,7,2, 6,7,6,5,4,9,3,6, 2,9,8,0,2,4,1,1, 3,0,4,9,8,9,7,8, 9,5,6,4,8,8,8,5, 8,9,6,5,6,1,9,0, 7,3,1,2,9,4,5,1, 7,1,9,2,2,1,5,7, 9,3,6,9,6,3,8,2, 2,9,7,4,2,5,3,7, 3,3,1,9,6,7,6,1 |