我正在尝试使用JSON blob制作一个包含多行的绘图,如下所示:
{"2007": [{"val":10, "mon":10}, {"val":20, "mon":11}, {"val":40, "mon":12}, ...],
"2008": [{"val":20, "mon":8}, {"val":20, "mon":9}, {"val":40, "mon":10}, ...],
...
"2012": [{"val":40, "mon":8}, {"val":50, "mon":9}, {"val":60, "mon":10}, ...]
}
这些数据基本上是每年的月度总数,有些年份没有几个月的数据。我无法弄清楚如何解析d3中的数据。我试过各种方法,比如
var line = d3.svg.line()
.interpolate("basis")
.x(function(d) { return x(d.mon); })
.y(function(d) { return y(d.val); });
svg.selectAll(".line")
.data(series)
.enter().append("path")
.attr("class", "line")
.attr("d", line);
但我似乎无法将数据输入SVG线。有什么建议?有没有更好的方法来构建JSON?
答案 0 :(得分:4)
以下是其他人遇到此问题时的问题。诀窍是传递一个函数,该函数返回路径元素的“d”属性中关联数组中的值。
entries = d3.entries(data);
var colors = d3.scale.category20()
.domain(d3.keys(data));
var line = d3.svg.line()
.interpolate("basis")
.x(function(d) { return x(d.month) })
.y(function(d) { return y(d.value) });
svg1.selectAll(".line")
.data(entries)
.enter().append("path")
.attr("class", "line")
// function(d), not just line function
.attr("d", function(d){ return line(d.value); })
.attr("stroke", function(d) { return colors(d.key) });
这个答案也有一些帮助: Using nested data with javascript D3 problem
答案 1 :(得分:1)
我的猜测是,这里最大的问题是你从一个对象开始,而不是一个数组。 d3.data
采用数组,而不是对象,因此您可能需要设置数据:
[
[{"val":10, "mon":10}, {"val":20, "mon":11}, {"val":40, "mon":12}, ...],
[{"val":20, "mon":8}, {"val":20, "mon":9}, {"val":40, "mon":10}, ...],
...
]
如果您需要将当前数据转换为此格式,请查看d3.entries
,它会为您提供包含密钥和点数组的数组:
[
{
key: "2008",
value: [{"val":10, "mon":10}, {"val":20, "mon":11}, {"val":40, "mon":12}, ...]
},
{
key: "2008",
value: [{"val":20, "mon":8}, {"val":20, "mon":9}, {"val":40, "mon":10}, ...]
},
...
]
使用上面的第一种数据格式,查看图表的简单案例版本的小提琴:http://jsfiddle.net/nrabinowitz/kmmyc/