如何在d3.js(albersUsa)中为每个州添加Label?

时间:2015-02-03 17:35:49

标签: javascript json dom d3.js

us.json已加载,但是当我尝试添加Label名称时,我无法使其正常工作。我在.json文件中没有看到name属性,所以如何添加每个州名?我对这个框架很陌生。

我在Google和Stackoverflow上尝试了不同的教程,但它们都不适合我。这是我试过的情侣教程的链接,我认为这是值得的。

我的担忧:

  1. 我想我在us.json文件中缺少name属性。 (如果这是问题,是否有任何其他.json文件包含州名?如何使用该文件的州名?)
  2. 美国州名是否包含在http://d3js.org/topojson.v1.min.js
  3. .html文件(已加载框架)

    <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
    <script src="http://d3js.org/topojson.v1.min.js"></script>
    

    .js文件:

    var width = 1500,
        height = 1100,
        centered;
    
    
    var usData = ["json/us.json"];
    var usDataText = ["json/us-states.json"];
    
    var projection = d3.geo.albersUsa()
        .scale(2000)
        .translate([760, height / 2]);
    
    var path = d3.geo.path()
        .projection(projection);
    
    var svg = d3.select("body").append("svg")
        .style("width", "100%")
        .style("height", "100%");
    
    
    svg.append("rect")
        .attr("class", "background")
        .attr("width", width)
        .attr("height", height)
        .on("click", clicked);
    
    var g = svg.append("g");
    
    d3.json(usData, function(unitedState) {
      g.append("g")
        .attr("class", "states-bundle")
        .selectAll("path")
        .data(topojson.feature(unitedState, unitedState.objects.states).features)
        .enter()
        .append("path")
        .attr("d", path)
        .attr("class", "states")
        .on("click", clicked);
    });
    

    先谢谢大家。如果你告诉我你在哪里学习d3.js,我也很感激。

1 个答案:

答案 0 :(得分:8)

正如您所说,us.json中没有州名。然而,它拥有独特的ID,幸运的是,Bostock先生已将这些ID映射到名称here

所以,让我们稍微修改一下这段代码。

首先,提出json请求来提取数据:

// path data
d3.json("us.json", function(unitedState) {
  var data = topojson.feature(unitedState, unitedState.objects.states).features;
  // our names
  d3.tsv("us-state-names.tsv", function(tsv){
    // extract just the names and Ids
    var names = {};
    tsv.forEach(function(d,i){
      names[d.id] = d.name;
    });

现在添加我们的可视化:

// build paths
g.append("g")
  .attr("class", "states-bundle")
  .selectAll("path")
  .data(data)
  .enter()
  .append("path")
  .attr("d", path)
  .attr("stroke", "white")
  .attr("class", "states");

 // add state names
 g.append("g")
  .attr("class", "states-names")
  .selectAll("text")
  .data(data)
  .enter()
  .append("svg:text")
  .text(function(d){
    return names[d.id];
  })
  .attr("x", function(d){
      return path.centroid(d)[0];
  })
  .attr("y", function(d){
      return  path.centroid(d)[1];
  })
  .attr("text-anchor","middle")
  .attr('fill', 'white');

  ....

这是一个有效的example