在D3中访问嵌套数据

时间:2016-02-02 15:46:29

标签: d3.js

我无法理解何时以及如何使用嵌套数据。

在这个例子中,我有一个名称('Name')和位置('起点')的CSV。通过为位置分配键,我可以制作一个包含所有位置的下拉列表,我想用它来过滤与每个位置相关联的名称。

但是我无法找到数据的值,在本例中为'd.Name'

在更新函数内部,我试图访问数据连接上的“值”。

  var adventurer = canvas
      .selectAll(".adventurer")
      .data(function(d) {
        return d.values;
      })

我也试过创建一个额外的数据变量,但这对我来说也不起作用。

对不起,我不能成为一个jsfiddle,但这里是plunk

DATA

,,Name,First names,s,r,Nat,born,starting point,starting date,arrival date,days,km,Assist,Support,Style,note,arrival date 2
1,1,KAGGE,Erling,,,Nor,1/15/1963,Berkner Island,11/18/1992,1/7/1993,50,appr. 1300,n,n,solo,first solo unassisted,
2,2,ARNESEN,Liv,f,,Nor,6/1/1953,Hercules Inlet,11/4/1994,12/24/1994,50,1130,n,n,solo,first woman unassisted,
3,3,HAUGE,Odd Harald,,,Nor,1956,Berkner Island,11/4/1994,12/27/1994,54,appr. 1300,n,n,,,

HTML

<div id="menu"></div>
<div id="chart"></div>

SCRIPT

  d3.csv("data.csv", function(csv_data) {

  var data = d3.nest()
    .key(function(d) {
      return d['starting point'];})
      .sortKeys(d3.ascending)
    .entries(csv_data)
  console.log(data);

  //create dropdown select

  var list = d3.select("#menu").append("select")

  list.selectAll("option")
    .data(data)
    .enter().append("option")
    .attr("value", function(d) {
      return d.key;
    })
    .text(function(d) {
      return d.key;
    });

  //chart config

  var w = 375,
      h = 1000;

  var canvas = d3.select('#chart')
    .append('svg')
    .attr('width', w)
    .attr('height', h)
    .append('g')
    .attr('transform', 'translate (0,50)');

  //function (bind, add, remove, update)

  function updateLegend(data) {

    var adventurer = canvas
      .selectAll(".adventurer")
      .data(function(d) {
        return d.values;
      })

    var adventurerEnter = adventurer
      .enter().append("g")
      .attr('class', 'adventurer');

    adventurerEnter
      .append("text")
      .attr('class', 'name')
      .attr('x', 0);

    adventurer.select('.name')
      .text(function(d, i) {
        return d.Name;
      })
      .attr('y', function(d, i) {
        return i * 30;
      });

    // remove old elements
    adventurer.exit().remove();

  };

  // generate initial legend
  updateLegend(data);

});

// handle on click event

  d3.select('#menu')
    .on('change', function() {
    var data = eval(d3.select(this).property('value'));
    console.log(data)
    updateLegend(data);
  });

1 个答案:

答案 0 :(得分:0)

您需要显示位置和名称。您有位置/名称的嵌套(在插件中但不在您的问题中),但您还需要一个不同的名称列表,或者可能是名称/位置列表:

fread(&buffer, 256, 1, file);

然后你必须显示你想要的名字。然后你需要一个.on('change',function()...)处理程序(或点击或任何符合你需要的处理程序),它实际上过滤了显示它们的名字。

我还修复了你的排序。 d3.ascending是数字,而不是字符串。