旭日形象可视化中的d3js分区布局错误

时间:2015-09-22 11:50:28

标签: javascript d3.js data-visualization

我正在跟随http://bl.ocks.org/mbostock/4063423处的示例创建一个旭日图表并且正在接收 Uncaught TypeError:无法读取未定义错误的属性“长度”,但我不确定原因。这是我在错误之前记录的图像:

log

index.html:49是return d.children? d.children : d.entries ? d.entries() : d.text? null : d.value.length ? d.value : d.value.entries(); 在我的分区变量中。我意识到对象没有value键,但我不确定为什么没有或如何解决这个问题所以任何帮助都将不胜感激!请参阅下面的整个代码以及Google工作表上数据的链接。

https://docs.google.com/spreadsheets/d/1d0T0nFJoLcTYtsuEux5yPqNKWUmS9P1PAyh119RVjsQ/edit#gid=638421312

var width = 960,
    height = 700,
    radius = Math.min(width, height) / 2,
    color = d3.scale.category20c();

var hiearchicalDataScale = d3.scale.linear().range([0,1135840])

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
  .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height * .52 + ")");

var partition = d3.layout.partition()
    .sort(null)
    .size([2 * Math.PI, radius * radius])
    .value(function(d) { return 1; })
    .children(function(d) {
      console.log(d)
      return d.children? d.children : d.entries ? d.entries() : d.text? null : d.value.length ? d.value : d.value.entries();
    });

var arc = d3.svg.arc()
    .startAngle(function(d) { return d.x; })
    .endAngle(function(d) { return d.x + d.dx; })
    .innerRadius(function(d) { return Math.sqrt(d.y); })
    .outerRadius(function(d) { return Math.sqrt(d.y + d.dy); });

d3.tsv("data.tsv", function(error, root) {


  var data = root.filter(function(d) {
    if(d.OilCum.indexOf("/") === -1 && d.OilCum.indexOf("_") === -1) {
      d.OilCum = +d.OilCum
      return d
    }
  })
  .map(function(d) {
    return { Reservoir: d.Reservoir, OilCum: d.OilCum, Field: d.Field }
  })


  var hiearchicalData = d3.nest()
    .key(function(d) {return d.Reservoir})
    .key(function(d) {return d.Field})
    .map(data, d3.map)

  hiearchicalDataScale.domain([
      d3.min(data, function(d) { return d.OilCum}),
      d3.max(data, function(d) { return d.OilCum})
    ])  

  var path = svg.datum(hiearchicalData).selectAll("path")
      .data(partition.nodes)
    .enter().append("path")
      .attr("display", function(d) { return d.depth ? null : "none"; }) // hide inner ring
      .attr("d", arc)
      .style("stroke", "#fff")
      .style("fill", function(d) { 
        return color(d.children ? d.key : d.text);
      })
      .style("fill-rule", "evenodd")
      .each(stash);

  d3.selectAll("input").on("change", function change() {
    var value = this.value === "count"
        ? function() { return 1; }
        : function(d) { return d.OilCum; };

    path
        .data(partition.value(value).nodes)
      .transition()
        .duration(1500)
        .attrTween("d", arcTween);
  });
});

// Stash the old values for transition.
function stash(d) {
  d.x0 = d.x;
  d.dx0 = d.dx;
}

// Interpolate the arcs in data space.
function arcTween(a) {
  var i = d3.interpolate({x: a.x0, dx: a.dx0}, a);
  return function(t) {
    var b = i(t);
    a.x0 = b.x;
    a.dx0 = b.dx;
    return arc(b);
  };
}

1 个答案:

答案 0 :(得分:1)

问题在于:

var partition = d3.layout.partition()
    .sort(null)
    .size([2 * Math.PI, radius * radius])
    .value(function(d) { return 1; })
    .children(function(d) {
      console.log(d)
      return d.children? d.children : d.entries ? d.entries() : d.text? null : d.value.length ? d.value : d.value.entries();
    });

当你做

时它会破裂
d.children? d.children : d.entries ? d.entries() : d.text? null : d.value.length ? d.value : d.value.entries();

注意此处 d.value.length d.value 对于某些值 undefined 因此你得到错误未定义的长度

我更改了这一行:

d.children? d.children : d.entries ? d.entries() : d.text? null : d.value ? d.value.entries() : null;

这里我正在检查d.value是否未定义,如果是,则返回d.value.entries(),否则返回null。