javascript - d3 转换堆积条形图

标签 javascript d3.js

您好,我目前在 d3,js 中有一个堆叠条形图,目前无法转换。 图表能够更新,但不幸的是没有转换:( 我感觉有 1 行修复此问题。 请帮忙!!! 这是从 http://bl.ocks.org/anotherjavadude/2940908

<!DOCTYPE html>
<html>
    <head>
        <title>Simple Stack</title>
        <script src="http://d3js.org/d3.v3.js"></script>     
        <style>
            svg {
                border: solid 1px #ccc;
                font: 10px sans-serif;
                shape-rendering: crispEdges;
            }
        </style>             
    </head>
    <body>

        <div id="viz"></div>

        <script type="text/javascript">

            var w = 960,
            h = 500

            // create canvas
            var svg = d3.select("#viz").append("svg:svg")
            .attr("class", "chart")
            .attr("width", w)
            .attr("height", h )
            .append("svg:g")
            .attr("transform", "translate(10,470)");

            x = d3.scale.ordinal().rangeRoundBands([0, w-800])
            y = d3.scale.linear().range([0, h-100])
            z = d3.scale.ordinal().range(["blue", "lightblue"])





            // console.log("RAW MATRIX---------------------------");
        // 3 columns: ID,c1,c2
            var matrix = [
                [ 1,  5871, 8916]
            ];
            // console.log(matrix)
            var matrix2 = [
                [ 1,  21, 800]
            ];


            function rand_it(x){
              return Math.floor((Math.random() * x) + 1);
            }


            function render(matrix){

                var t = d3.transition()
                          .duration(300);

                // remove
                svg.selectAll("g.valgroup")
                   .remove();

                svg.selectAll("rect")
               .transition(t)               
               .remove();

                var remapped =["c1","c2"].map(function(dat,i){
                    return matrix.map(function(d,ii){
                        return {x: ii, y: d[i+1] };
                    })
                });
                console.log("NEW ONE !!!\n",matrix[0]);

                // console.log("LAYOUT---------------------------");
                var stacked = d3.layout.stack()(remapped)

                x.domain(stacked[0].map(function(d) { return d.x; }));
                y.domain([0, d3.max(stacked[stacked.length - 1], function(d) { return d.y0 + d.y; })]);

                // Add a group for each column.
                var valgroup = svg.selectAll("g.valgroup")
                .data(stacked) 
                .enter().append("svg:g")
                .classed("valgroup", true)
                .style("fill", function(d, i) { return z(i); })
                .style("stroke", function(d, i) { return d3.rgb(z(i)).darker(); });

                // Add a rect for each date.
                var rect = valgroup.selectAll("rect")
                .data(function(d){return d;})
                .enter().append("svg:rect")
                .transition(t)
                .attr("x", function(d) { return x(d.x); })
                .attr("y", function(d) { return -y(d.y0) - y(d.y); })
                .attr("height", function(d) { return y(d.y); })
                .attr("width", x.rangeBand());

                // column
                rect.selectAll("rect")
                    .transition() // this is to create animations
                    .duration(500) // 500 millisecond
                    .ease("bounce")
                    .delay(500)
                    .attr("x", function(d) { return x(d.x); })
                    .attr("y", function(d) { return -y(d.y0) - y(d.y); })
                    .attr("height", function(d) { return y(d.y); })
                    .attr("width", x.rangeBand());          

            };

            render(matrix);
            setInterval( function() { render([[1, rand_it(10), rand_it(50)]]); console.log("2"); }, 5000 );


        </script>
    </body>
</html>

最佳答案

您没有正确使用transition()。转换从先前值更改为最终值。因此,在这段代码中:

var something = svg.append("something").attr("x", 10);
something.transition().duration(500).attr("x", 20);

某物的 x 属性将在 500 毫秒内从 10 变为 20。

但是当你这样做时,就像你所做的那样:

var rect = valgroup.selectAll("rect")
            .data(function(d){return d;})
            .enter().append("svg:rect")
            .transition(t)
            .attr("x", function(d) { return x(d.x); })
            .attr("y", function(d) { return -y(d.y0) - y(d.y); })
            .attr("height", function(d) { return y(d.y); })
            .attr("width", x.rangeBand());

以前的值在哪里?这是一个“输入”选择。为了让事情变得更复杂,你做了:

svg.selectAll("rect")
           .transition(t)               
           .remove();

在函数的开头,因此没有矩形可以进行任何过渡。

我对您的代码进行了一些更改,删除了 remove() 并创建了一些“更新”选择:https://jsfiddle.net/gerardofurtado/3ahrabyj/

请记住,这不是一个优化的代码,更不是一个漂亮的代码:我只做了最少的更改以使转换正常工作,您必须在这里进行大量改进。

关于javascript - d3 转换堆积条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39723113/

相关文章:

javascript - SailsJS - 使用自定义 ID 创建新记录

javascript - 如何释放 JavaScript 中的内存

javascript - 使用 HTML5 范围输入操作 d3.js 包布局

javascript - 如何控制 D3 树中的链接?

json - 无法将 JSON 绑定(bind)到 d3

javascript - Closure Compiler 对此不应用@const

javascript - Java Script 从服务器(asp.net)获取数据并将其保存在本地存储(客户端)

javascript - 在一个几何体的不同面上使用多个纹理

javascript - D3.js HTML 列表和子列表上的嵌套数据连接

javascript - react : export 'time' (imported as 'd3' ) was not found in 'd3