我正在开发堆叠图表应用程序。
http://jsfiddle.net/NYEaX/174/
我把它放在一个jquery插件中来创建多个实例等......不同的属性以及最终不同的数据源。
目前我在制作图表条和轴的动画时遇到问题。
动画条形码
animateBars: function(selector, data){
var w = $(selector).data("width");
var h = $(selector).data("height");
var margin = methods.getMargin(h);
methods.setDimensions(w, h, margin);
//methods.setX();
//methods.setY();
//methods.setDomain(data);
var initialHeight = 0;
//var svg = d3.select(selector + " .stackedchart");
var barholder = d3.select(selector + " .barholder");
var state = barholder.selectAll(".state")
.data(data)
.enter()
.append("g")
.attr("class", "g")
.attr("x", function(d) {
return methods.x(d.Label);
})
.attr("transform", function(d) {
return "translate(" + methods.x(d.Label) + ",0)";
});
var bar = state.selectAll("rect")
.data(function(d) {
return d.blocks;
});
// Enter
bar.enter()
.append("rect")
.attr("width", methods.x.rangeBand())
.attr("y", function(d) {
return methods.y(d.y1);
})
.attr("height", function(d) {
return methods.y(d.y0) - methods.y(d.y1);
})
.style("fill", function(d) {
return methods.color(d.name);
});
// Update
bar
.attr("y", function(d) {
return methods.y(d.y1);
})
.attr("height", function(d) {
return methods.y(d.y0) - methods.y(d.y1);
})
.transition()
.duration(500)
.attr("x", function(d) {
return methods.x(d.Label);
})
.attr("width", methods.x.rangeBand())
.attr("y", function(d) {
return methods.y(d.y1);
})
.attr("height", function(d) {
return methods.y(d.y0) - methods.y(d.y1);
});
// Exit
bar.exit()
.transition()
.duration(250)
.attr("y", function(d) {
return methods.y(d.y1);
})
.attr("height", function(d) {
return methods.y(d.y0) - methods.y(d.y1);
})
.remove();
}
答案 0 :(得分:0)
一个问题是“state”是从“enter()”方法生成的,因此所有“bar”调用仅在生成“g.class”时执行,而不是在更新时执行。改变这个:
var state = barholder.selectAll(".state")
.data(data)
.enter()
.append("g")...
到此:
var state = barholder.selectAll(".state")
.data(data);
state.enter().append("g")...
看看是否有所帮助。它似乎不会影响你的小提琴,但你可能会遇到除d3以外的问题。尝试简化你的小提琴并首先让d3的东西自行工作。