正确使用D3 Streamgraph中的stack.values([accessor])?

时间:2012-06-13 06:46:45

标签: javascript layout d3.js area stream-graph

我正在尝试使用值访问器创建一个包含每层附加数据的D3流图表,如D3 API referencethis question at Stack Overflow所示。

标题附加正常,但似乎没有附加值。关于可能出现什么问题的任何想法?

我是d3的新手,所以我确信它很简单。代码如下。

var layers = [
  {
    "name": "apples",
    "values": [
      { "x": 0, "y":  91},
      { "x": 1, "y": 290}
    ]
  },
  {  
    "name": "oranges",
    "values": [
      { "x": 0, "y":  9},
      { "x": 1, "y": 49}
    ]
  }
];

var     m = 2; // number of samples per layer
var width = 960,
    height = 500,
    mx = m - 1,
    my = 350;

var stack = d3.layout.stack()
    .offset("wiggle")
    .values(function(d) { return d.values; });

var area = d3.svg.area()
    .x(function(d) { 
        return d.x * width / mx; 
    })
    .y0(function(d) { 
        return height - d.y0 * height / my; 
    })
    .y1(function(d) { 
        return height - (d.y + d.y0) * height / my; 
    });

var vis = d3.select("#chart")
  .append("svg")
    .attr("width", width)
    .attr("height", height);

vis.selectAll("path")
    .data(stack(layers))
  .enter().append("path")
    .attr("d", area)
  .append("title")
    .text(function(d) { return d.name; });

1 个答案:

答案 0 :(得分:7)

堆栈布局知道您指定的值访问器,但区域生成器不知道。所以,你必须将d.values而不是d传递给区域生成器,如下所示:

.attr("d", function(d) { return area(d.values); })