d3.js叠加图表动画

时间:2014-03-05 17:12:51

标签: javascript d3.js stacked-chart

我正在开发堆叠图表应用程序。

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();

                    }

1 个答案:

答案 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的东西自行工作。