I created a multiple-line chart using nvd3,但是无法以某些重要方式对其进行修改。我想使用直接的d3js来展示自己的内容,但是我在思考联接方面很挣扎。
我需要为每个d.key
和它自己的对应d.values
创建一个路径。
我的数据被格式化为nvd3,如下所示(节略)。
[
{
"key":"brw-a",
"values":[
["2012-07-11T00:00:00", 0.0 ],
["2012-07-11T23:59:59", 0.0 ],
["2012-07-05T06:31:47", 0.0 ],
["2012-07-05T23:59:59", 0.0 ]
]
},
{
"key":"brw-c",
"values":[
["2012-07-11T00:00:00", 0.0 ],
["2012-07-07T00:00:00", 2.0 ],
["2012-07-05T23:59:59", 4.0 ]
]
}
]
我似乎需要一个内部循环来访问存储在每个
d.values
中的数组。 I have a working example演示d.values
如何在一大堆无用的情况下出现。var p = d3.select("body").selectAll("p")
.data(data)
.enter().append("p")
.text(function(d) {return d.key +": " + '[' + d.values + ']'})
我感觉自己已经接近了,并且与以下内容有关:
.data(data, function(d) { return d.key; })
更新:我能够手动遍历数据以创建所需的效果。也许没有办法通过联接做到这一点?当然,请保存使用精彩的nvd3库。请参阅下面的注释以获取链接。
var body = d3.select("body")
for (i=0; i < data.length; i++) {
var key = data[i].key
var values = data[i].values
body.append("h3")
.text(key)
for (j=0; j < values.length; j++) {
body.append("p")
.text(values[j][0] + " -- " + values[j][1])
}
}
最佳答案
您对.data()
函数是正确的。但是,由于您需要遍历values
中的元素,因此需要将其作为数据传递给嵌套选择:
.data(function(d) { return d.values})
您可以尝试以下方法:
var p = d3.select("body").selectAll("p")
.data(data)
.enter().append("p")
.attr("id", function(d) { return d.key})
.text(function(d) {return d.key})
.selectAll("span")
.data(function(d) { return d.values})
.enter().append("span")
.text(function(d) {return d})
产生:
<p id="brw-a">brw-a
<span>2012-07-05T00:00:00,0</span>
<span>2012-07-06T23:59:59,1</span>
<span>2012-07-07T06:31:47,0</span>
<span>2012-07-08T23:59:59,3</span>
</p>
<p id="brw-c">brw-c
<span>2012-07-11T00:00:00,0</span>
<span>2012-07-07T00:00:00,2</span>
<span>2012-07-05T23:59:59,4</span>
</p>