Dessiner le plan thermique avec d3

J'essaie de dessiner un plan thermique avec d3 en utilisant les données d'un csv: c'est ce que j'ai jusqu'ici

Étant donné un fichier csv:

row,col,score 0,0,0.5 0,1,0.7 1,0,0.2 1,1,0.4 

J'ai un svg et un code comme suit:

 <svg id="heatmap-canvas" style="height:200px"></svg> <script> d3.csv("sgadata.csv", function(data) { data.forEach(function(d) { d.score = +d.score; d.row = +d.row; d.col = +d.col; }); //height of each row in the heatmap //width of each column in the heatmap var h = gridSize; var w = gridSize; var rectPadding = 60; $('#heatmap-canvas').empty(); var mySVG = d3.select("#heatmap-canvas") .style('top',0) .style('left',0); var colorScale = d3.scale.linear() .domain([-1, 0, 1]) .range([colorLow, colorMed, colorHigh]); rowNest = d3.nest() .key(function(d) { return d.row; }) .key(function(d) { return d.col; }); dataByRows = rowNest.entries(data); mySVG.forEach(function(){ var heatmapRow = mySVG.selectAll(".heatmap") .data(dataByRows, function(d) { return d.key; }) .enter().append("g"); //For each row, generate rects based on columns - this is where I get stuck heatmapRow.forEach(function(){ var heatmapRects = heatmapRow .selectAll(".rect") .data(function(d) {return d.score;}) .enter().append("svg:rect") .attr('width',w) .attr('height',h) .attr('x', function(d) {return (d.row * w) + rectPadding;}) .attr('y', function(d) {return (d.col * h) + rectPadding;}) .style('fill',function(d) { if(d.score == NaN){return colorNA;} return colorScale(d.score); }) }) </script> 

Mon problème concerne l'imbrication. Ma nidification est basée sur 2 touches, la première ligne (utilisée pour générer les lignes) puis pour chaque ligne, il y a plusieurs clés imbriquées pour les colonnes et chacune de celles-ci contient mon score. Je ne sais pas comment procéder, c.-à-d. Passer sur les colonnes et ajouter des rectangles aux couleurs

Toute aide serait appréciée

Alors que vous pourriez utiliser une sous- subselect (voir d3.js construire une grille de rectangles ) pour travailler avec des données imbriquées en d3 il n'est pas vraiment nécessaire dans ce cas. J'ai mis en place un exemple en utilisant vos données à http://jsfiddle.net/QWLkR/2/ . C'est la partie clé:

 var heatMap = svg.selectAll(".heatmap") .data(data, function(d) { return d.col + ':' + d.row; }) .enter().append("svg:rect") .attr("x", function(d) { return d.row * w; }) .attr("y", function(d) { return d.col * h; }) .attr("width", function(d) { return w; }) .attr("height", function(d) { return h; }) .style("fill", function(d) { return colorScale(d.score); }); 

Fondamentalement, vous pouvez simplement utiliser la row et col pour calculer la position correcte des carrés dans votre plan thermique.