代码之家  ›  专栏  ›  技术社区  ›  Alex Spangher

使用正方形表示地图中的计数

  •  3
  • Alex Spangher  · 技术社区  · 8 年前

    这可能是一个简单的问题,但我有一个d3的地图,我想用正方形表示事件计数。

    下面是我想要的一个例子:

    rough sketch

    它们在图片中没有完全对齐,但假设我有一个JSON:

    [
        {city:'New York', count:3},
        {city:'Washington, D.C.', count:1},
        {city:'Austin', count:5},
        {city:'Havana', count:8}
    ] 
    

    我对此感到困惑,我想也许力导向图能解决这个问题?我也看到了这一点: http://bl.ocks.org/XavierGimenez/8070956 还有这个: http://bl.ocks.org/mbostock/4063269 那可能会让我接近。

    对于背景和设置(我不需要帮助绘制地图,只是为了分享),下面是我用于项目的回购: https://github.com/alex2awesome/custom-map ,它显示了我表示计数的旧方法(通过以每个城市为中心的圆的半径)。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gerardo Furtado    8 年前

    至少有人知道这叫什么吗?

    这在dataviz中的技术名称是 象形图 .

    这是绘制矩形的通用代码,您必须根据需要更改某些部分。最重要的部分是矩形的计算 x y modulo operator .

    首先,让我们设置每个矩形的初始位置和大小。你必须根据你的坐标来设置这个。

    var positionX = 5;
    var positionY = 5;
    var size = 5;
    

    然后,让我们设置您想要多少矩形(在您的代码中,这将是 d.count ):

    var count = 15;
    var gridSize = Math.ceil(Math.sqrt(count));
    var data = d3.range(count);
    

    根据计数,我们设置 gridSize data .

    现在我们绘制矩形:

    var rects = svg.selectAll(".rects")
        .data(data)
        .enter()
        .append("rect");
    
    rects.attr("width", size)
        .attr("height", size)
        .attr("x", function(d,i){ return positionX + (i%gridSize)*(size*1.1)})
        .attr("y", function(d,i){ return positionY + (Math.floor((i/gridSize)%gridSize))*(size*1.1) })
        .attr("fill", "red");
    

    这里是一个工作片段,使用15作为计数(4、9、16、25等将给您一个完美的正方形)。改变 count 看看它是如何适应的:

    var svg = d3.select("body")
    	.append("svg")
    	.attr("width", 50)
    	.attr("height", 50);
    	
    var count = 15;
    var size = 5;
    var positionX = 5;
    var positionY = 5;
    var gridSize = Math.ceil(Math.sqrt(count));
    var data = d3.range(count);
    
    var rects = svg.selectAll(".rects")
    	.data(data)
    	.enter()
    	.append("rect");
    	
    rects.attr("width", size)
    	.attr("height", size)
    	.attr("x", function(d,i){ return positionX + (i%gridSize)*(size*1.2)})
    	.attr("y", function(d,i){ return positionY + (Math.floor((i/gridSize)%gridSize))*(size*1.2) })
    	.attr("fill", "red");
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>