Basic D3 - 在对象内部使用数组

Basic D3 - Working with arrays inside objects

我是 D3 的新手,我现在被困在一个我认为非常基础的特定主题上。我整天都在研究可以帮助我的东西,但我发现的一切最终都不是我所需要的,无论如何,如果已经被问到,我从现在开始道歉。

基本上,到目前为止,我一直在使用数组创建散点图,例如:

 var dataset = [[100,220],[130,350],[70,60],[100,140],[520,300],[120,280],[390,170]];

然后:

     var chart = d3.select("body")
    .append("svg")
    .attr("width",w)
    .attr("height",h);

    var plot = chart
    .selectAll("circle")
    .data(dataset)
    .enter()
    .append("circle")
    .attr("cx",function(d){return d[0];})
    .attr("cy",function(d){return d[1];})
    .attr("r",function(d,i){return i*4});

如果现在我想使用由对象而不是数组组成的数据集,它在进行一些调整后仍然可以正常工作:

var dataset = [
    {x:100,y:220},
    {x:130,y:350},
    {x:70,y:60},
    {x:100,y:140},
    {x:520,y:300},
    {x:120,y:280},
    {x:390,y:170}
    ];

更新后的代码:

    var chart = d3.select("body")
    .append("svg")
    .attr("width",w)
    .attr("height",h);

    var plot = chart
    .selectAll("circle")
    .data(dataset)
    .enter()
    .append("circle")
    .attr("cx",function(d){return d.x;})
    .attr("cy",function(d){return d.y;})
    .attr("r",function(d,i){return i*4});

然后我更进一步,创建了多个具有多个 x 和 y 坐标的对象(我对这种特殊情况很感兴趣,因为我未来的工作数据集 [真实数据集] 由一系列风组成每个涡轮机都有数千个 x-y 点)。

var dataset = [ {Turbine: "01", x:[100,130,70,100],y:[220,350,60,140]},
                        {Turbine "02", x:[520,120,390,500], y:[300,280,170,400]};

到目前为止,我不知道应该对上面的代码进行哪些改进才能正常工作。我意识到 d.x 和 d.y 现在不提供单个 x 和单个 y 点,它们提供数组,这就是为什么以前的代码现在无用,因为属性 cx 和 cy 每次迭代只期望一个坐标.我正在尝试找到一种方法,以某种方式能够在子选择中使用新索引(对于 d 中的每个 i,代码应使用 ii 从子选择 d[i].x[ii 中仅获取一个点]).

有什么想法吗?感谢您提前抽出时间!

您需要考虑如何将您的真实数据转化为散点图。我的建议是,将所有数据展平成单独的点,并用不同的颜色区分两个涡轮机。

var colors = ['orange', 'green'];

function convertData(dataset) {
  var data = [];
  dataset.forEach(function(oneDataset, datasetIndex) {
    // Split the x and y arrays into pairs
    // (that's assuming oneDataset.x and oneDataset.y are the same length!)
    for (var i=0; i<oneDataset.x.length; i++) {
      data.push({
        x: oneDataset.x[i],
        y: oneDataset.y[i],
        color: colors[datasetIndex]
      });
    }
  });
}

var rawDataset = [ {Turbine: "01", x:[100,130,70,100],  y:[220,350,60, 140]},
                   {Turbine: "02", x:[520,120,390,500], y:[300,280,170,400]};

var dataset = convertData(rawDataset);

现在重新使用您的 "solution 2" 代码,但使用新的颜色改进:

var plot = chart
  .selectAll("circle")
  .data(dataset)
  .enter()
  .append("circle")
  .attr("cx",   function(d)   {return d.x;})
  .attr("cy",   function(d)   {return d.y;})
  .attr("r",    function(d,i) {return i*4})
  .attr("fill", function(d)   {return c.color});

这只是一种解决方案。但是在所有情况下,您可能都需要 "flatten" 将您的长数组转换成坐标对以呈现散点图。