Sunday, May 19, 2024
 Popular · Latest · Hot · Upcoming
193
rated 0 times [  200] [ 7]  / answers: 1 / hits: 24635  / 12 Years ago, wed, october 17, 2012, 12:00:00

I am trying to draw a heatmap with d3 using data from a csv: this is what I have so far



Given a csv file:



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


I have an svg and code as follows:



<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>


My problem is with the nesting. My nesting is based on 2 keys, row first (used to generate the rows) then for each row, there are multiple nested keys for the columns and each of these contain my score.
I am not sure how to proceed i.e. loop over columns and add rectangles with the colors



Any help would be appreciated


More From » d3.js

 Answers
20

While you could used a subselect (see d3.js building a grid of rectangles) to work with nested data in d3 it's not really needed in this case. I put together an example using your data at http://jsfiddle.net/QWLkR/2/. This is the key part:



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); });


Basically you can just use the row and col to calculate the correct position of the squares in your heatmap.


[#82514] Monday, October 15, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
darennevina

Total Points: 422
Total Questions: 128
Total Answers: 105

Location: Comoros
Member since Tue, Mar 14, 2023
1 Year ago
;