【问题标题】:D3 array object format not being picked up未拾取 D3 数组对象格式
【发布时间】:2014-11-18 09:06:54
【问题描述】:

我试图让 D3 理解对象中的数组,以便 D3 识别要创建两个元素,一个用于 10,一个用于 6。

如果我有一个标准数组,例如var myobj = [10,6]; D3 很好地理解了这一点并创建了两个元素。但是,如果数组嵌入到如下对象中,则 D3 不会这样做。我的问题是 a) 为什么 D3 不明白这一点? b)我怎样才能让 d3 明白我想要创建两个元素?我看过 d3.nested() 但我不明白。

感谢任何帮助

var myobj = 
    [
        {myarray:[10,6]}

    ];

  xx.selectAll(".newrec")
                .data(myobj)
                .enter()
                .append("rect")
                    .attr("class","newrec")
                    .attr("width",function (d) {return d.myarray;  }) //for width D3 returns one element rectangle with width of "10,6" which is not a width!
                    ;

【问题讨论】:

  • 如果只是这一个数组,你为什么不简单:.data(myobj[0].myarray)然后.attr("width",function (d) {return d; })

标签: javascript arrays d3.js


【解决方案1】:

如果您不想更改数据结构,可以执行以下操作:

var myobj = [ {myarray:[10,6,7]} ];

d3.selectAll(".newrec")
    .data(myobj[0].myarray)
    .enter()
    .append("rect")
    .attr("class","newrec")
    .attr("width",function (d) {console.log(d); return d});

这将创建 3 个具有适当宽度的 rects,例如:http://jsfiddle.net/henbox/f3vqp7ct/

【讨论】:

    【解决方案2】:

    要了解 D3 如何处理这些数据:

    var myobj = 
    [
        {myarray:[10,6]}
    
    ];
    
    console.log(myobj);
    

    当您使用浏览器时:

    你可以看到myobj是一个对象,里面有一个对象和一些属性(例如长度)。

    现在将该对象分解为各个部分:

    console.log(myobj);
    console.log(myobj[0]);
    console.log(myobj[0].myarray);
    console.log(myobj[0].myarray[0]);
    

    还有浏览器:

    这有望帮助您理解您的第一个问题,我认为这将使其余的问题开始变得有意义。请记住这一点:您可以将 D3 中的所有(大多数?)数据和 var 视为对象。

    我认为这是一个很好的例子来说明如何使用d3.nest,如果你愿意的话:

    有一个trial.csv 文件

    position,value
    "Outer",100
    "Inner",10
    "Inner",6
    

    “外部”和“内部”表示嵌套位置。

    现在通过“位置”嵌套-键,然后对每个键的“值”求和(除了求和之外,您可能还想做其他事情):

    d3.csv("trial.csv", function(error, csv_data) {
        var data = d3.nest()
            .key(function(d) { return d.position; })
            .rollup(function(d) {
                return d3.sum(d, function(i) { return i.value; });
            }).entries(csv_data);
    
        console.log(data);
        console.log(data[0]);
        console.log(data[1]);
    })
    

    前往浏览器:

    希望这会有所帮助!

    【讨论】:

    • 这真的很有用,有助于我理解 D3 和 JavaScript!有时在一个对象中包含一个长数组而不是创建数百万个对象来实现相同的结果非常有用。
    【解决方案3】:

    我认为你必须以其他方式来做。

    var myarray = 
    [
        {myObject:10, ...},
        {myObject:6, ...}
    ];
    
    xx.selectAll(".newrec")
                .data(myobj)
                .enter()
                .append("rect")
                    .attr("class","newrec")
                    .attr("width",function (d, i) {return d.myarray[i].myObject;  }) //for width D3 returns one element rectangle with width of "10,6" which is not a width!
                    ;
    

    【讨论】:

    • 感谢您的建议,您建议的方式是标准方式。但是,我不想继续重新定义 'myobject' 50 次。定义一次并附加一个 d3 可以解释的数组要容易得多。你认为即使 D3 可以解释数组也不可能
    • 我明白了。我认为 d3.data 旨在逐行处理,您希望拥有可以逐列处理的东西。我不认为d3可以直接做到这一点。您要么修改库...或使用逐行方法。如果您不想修改数据结构,我更喜欢单独附加元素。例如.data(myObj.myArray1).enter().append(sth).... .data(myObj.myArray2).enter().select(sth).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2012-07-19
    • 2014-02-13
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    相关资源
    最近更新 更多