【问题标题】:Drawing heatmap with d3用 d3 绘制热图
【发布时间】:2012-10-17 00:06:41
【问题描述】:

我正在尝试使用来自 csv 的数据使用 d3 绘制热图:这就是我目前所拥有的

给定一个 csv 文件:

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

我有一个 svg 和代码如下:

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

我的问题在于嵌套。我的嵌套基于 2 个键,首先是行(用于生成行),然后对于每一行,列有多个嵌套键,每个键都包含我的分数。 我不确定如何继续,即循环列并添加带有颜色的矩形

任何帮助将不胜感激

【问题讨论】:

    标签: javascript d3.js heatmap


    【解决方案1】:

    虽然您可以使用subselect(参见d3.js building a grid of rectangles)来处理d3 中的嵌套数据,但在这种情况下并不需要。我在http://jsfiddle.net/QWLkR/2/ 使用您的数据整理了一个示例。这是关键部分:

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

    基本上,您可以使用rowcol 来计算热图中正方形的正确位置。

    【讨论】:

    • 抱歉延期。我不知道我是否应该将其作为一个新问题发布,但是有没有办法调整矩形的大小以使其适合放入的 div?如果 div 没有预定义的宽度(即取决于屏幕大小?)
    • 您可以在绘制热图之前立即获取div 的大小,然后根据行数和列数计算heightwidth
    • 如果没有设置,我无法抓取 div 的大小,可以吗?
    • 必须设置一些东西,你可以用它来计算 div 的正确大小。 div 的大小或窗口的大小。如果不设置 SVG 容器的高度和宽度,就无法绘制 SVG 图像。
    • 我在最新的 Firefox 中看不到任何空格,因此您使用的版本似乎存在渲染问题。您可以尝试将 shape-rendering: crispEdges; 添加到单元格的 CSS 中。
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 2016-07-20
    • 1970-01-01
    • 2016-01-21
    • 2018-06-01
    • 2016-08-04
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多