我放弃了,我想不通。
我试图创建一个条形图,3d.js
但我无法让它工作。可能我对处理复杂的关联数组的理解还不够。
我的数组具有以下结构:
{"January"=>{"fail"=>13, "success"=>6},
"February"=>{"success"=>10, "fail"=>4},
"March"=>{"success"=>9, "fail"=>13},
"April"=>{"success"=>16, "fail"=>5},
"May"=>{"fail"=>52, "success"=>23},
"June"=>{"fail"=>7, "success"=>2},
"July"=>{},
"August"=>{"fail"=>6, "success"=>3},
"September"=>{"success"=>54, "fail"=>59},
"October"=>{"success"=>48, "fail"=>78},
"November"=>{"fail"=>4, "success"=>6},
"December"=>{"fail"=>1, "success"=>0}}`
我得到了轴工作的显示:
代码看起来很丑,因为我将名称转换为“普通”数组:
monthsNames = new Array();
i = 0;
for (key in data) {
monthsNames[i] = key;
i++;
}
x.domain(monthsNames);
y.domain([0, 100]);
但我无法弄清楚如何处理数据。
我试过这样的事情,svg.selectAll(".bar").data(d3.entries(data))
我猜这是一个好的开始,但我无法连接到轴工作。
我想要创建的是一个bar-chart
以月份为 x 轴并且每个月都有两个条形图(分别是一个有两种颜色的条形图) - 一个代表成功,一个代表失败。
有人可以帮我如何处理数据吗?提前致谢!
编辑:
我不知道如何缩放 x 和 y。如果我使用此代码:
var x = d3.scale.ordinal()
.domain(monthsNames)
.range([0, width]);
var y = d3.scale.linear()
.domain([0,100])
.range([0, height]);
什么都没有出现。如果我打印出使用例如 x(d.key) 或 x(d.value.fail) 后评估的值,它们真的是奇怪的数字,有时甚至是 NaN。
编辑:
d3.selectAll(".barsuccess")
.on('mouseover', function(d){
svg.append('text')
.attr("x", x(d.key))
.attr("y", y(d.value.success))
.text(d.value.success+"%")
.attr('class','success')
.style("font-size","0.7em")
})
.on('mouseout', function(d){
d3.selectAll(".success").remove()
});
d3.selectAll(".barfail")
.on('mouseover', function(d){
svg.append('text')
.attr("x", x(d.key)+x.rangeBand()/2)
.attr("y", y(d.value.fail))
.text(d.value.fail+"%")
.attr('class','fail')
.style("font-size","0.7em")
})
.on('mouseout', function(d){
d3.selectAll(".fail").remove()
});