使用d3.layout.stack()从图层访问自定义坐标

时间:2015-08-31 14:22:27

标签: javascript d3.js accessor

我有以下形式的数据数组:

_data = [
    {key: <String>, values: [<number>...]}
]

如果每个JSON对象中的'values'变量是一个JSON坐标数组(即“x:?,y:?”),我可以使用以下内容:

d3.layout.stack()
    .values(function(d) {
        return d.values;
    });

相反,我需要从每个图层的values数组中读取x作为values数组中的索引,y作为数字。像这样:

_data = [
    {key: "oranges", values: [5, 6, 8]},
    {key: "bananas", values: [2, 1, 9]}
]

becomes

"oranges": (0, 5), (1, 6), (2, 8);
"bananas": (0, 2), (1, 1), (2, 9);

如何做到这一点?

2 个答案:

答案 0 :(得分:1)

这是你正在寻找的吗?

&#13;
&#13;
var data = [
    {key: "oranges", values: [5, 6, 8]},
    {key: "bananas", values: [2, 1, 9]}
];

var newData = [];
var fruit;
var coords;
for (var i = 0; i < data.length; i++) {
  coords = [];
  for (var x = 0; x < data[i].values.length; x++) {
    coords.push([x, data[i].values[x]]);
  }

  fruit = {};
  fruit[data[i].key] = coords;
  newData.push(fruit);
}

alert(JSON.stringify(newData));
&#13;
&#13;
&#13;

或类似的东西?在需要时只格式化所需的数组?

d3.layout.stack()
    .values(function(d) {
      var coords = [];
      for (var x = 0; x < d.values.length; x++) {
        coords.push([x, d.values[x]]);
      }
      return coords;
    });

答案 1 :(得分:1)

如果我正确理解您的问题,您正在寻找适当的访问器功能,以便从D3的堆栈布局中访问您的特定数据格式。以下代码应该可以满足您的需求:

d3.layout.stack()
    .values(function(d) {
        return d.values.map(function(y, i) {
            return { "x": i, "y": y };
        });
    });

.map()的调用将转换您的data.values数组并返回一个数组,该数组包含xy坐标设置为您指定值的对象。