sunburst 可视化中的 d3js 分区布局错误

d3js partition layout error in sunburst visualization

我正在按照 http://bl.ocks.org/mbostock/4063423 中的示例创建旭日图,并收到 Uncaught TypeError: Cannot read 属性 'length' of undefined 错误,但不确定原因。这是我在错误之前记录的图像:

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 表上数据的 link。

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

问题出在这里:

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.lengthd.value为有些值是 undefined 因此你得到错误 length of undefined.

我更改了这一行:

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

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