Pagination with D3.js

2019-05-09 15:21发布

I am using a large amount of JSON data from an API for D3 bar charts. I would like to show only 10-20 bars at a time. Is there a way to paginate using D3 or do I need to do this another way (php)? Any best practices or suggestions are welcome.

2条回答
Emotional °昔
2楼-- · 2019-05-09 15:42

Please go thorugh this piece of code but it makes sense if you go through my block. I have only put the essential part of the code. Link: http://bl.ocks.org/pragyandas

 var legendCount = data.series.length;

            var legendWidth=10; var legendSpacing=6;

            var netLegendHeight=(legendWidth+legendSpacing)*legendCount;
            var legendPerPage,totalPages,pageNo;

            if(netLegendHeight/height > 1){

                legendPerPage=Math.floor(height/(legendWidth+legendSpacing));
                totalPages=Math.ceil(legendCount/legendPerPage);

                pageNo=1;

                var startIndex=(pageNo-1)*legendPerPage;
                var endIndex=startIndex+legendPerPage;
                var seriesSubset=[],colorSubset=[];

                for(var i=0;i<data.series.length;i++){
                    if(i>=startIndex && i<endIndex){
                        seriesSubset.push(data.series[i]);
                        colorSubset.push(colors[i]);
                    }
                }  

                DrawLegendSubset(seriesSubset,colorSubset,legendPerPage,pageNo,totalPages);
            }

            function DrawLegendSubset(seriesSubset,colorSubset,legendPerPage,pageNo,totalPages){

                var legend = svg.selectAll("g.legendg")
                .data(seriesSubset)
                .enter().append("g")
                .attr('class','legendg')
                .attr("transform", function (d, i) { return "translate(" + (width-40) + ","+ i*(legendWidth+legendSpacing) +")"; });

                legend.append("rect")
                .attr("x", 45)
                .attr("width", legendWidth)
                .attr("height", legendWidth)
                .attr("class", "legend")
                .style('fill',function(d,i){return colorSubset[i];});
                

                legend.append("text")
                .attr("x", 60)
                .attr("y", 6)
                .attr("dy", ".35em")
                .style("text-anchor", "start")
                .text(function (d) { return d.name; });


                var pageText = svg.append("g")
                .attr('class','pageNo')
                .attr("transform", "translate(" + (width+7.5) + ","+ (legendPerPage+1)*(legendWidth+legendSpacing) +")");

                pageText.append('text').text(pageNo+'/'+totalPages)
                .attr('dx','.25em');

                var prevtriangle = svg.append("g")
                .attr('class','prev')
                .attr("transform", "translate(" + (width+5) + ","+ (legendPerPage+1.5)*(legendWidth+legendSpacing) +")")
                .on('click',prevLegend)
                .style('cursor','pointer');

                var nexttriangle = svg.append("g")
                .attr('class','next')
                .attr("transform", "translate(" + (width+20) + ","+ (legendPerPage+1.5)*(legendWidth+legendSpacing) +")")
                .on('click',nextLegend)
                .style('cursor','pointer');

                nexttriangle.append('polygon')
                    .style('stroke','#000')
                    .style('fill','#000')
                    .attr('points','0,0, 10,0, 5,5');

                prevtriangle.append('polygon')
                    .style('stroke','#000')
                    .style('fill','#000')
                    .attr('points','0,5, 10,5, 5,0');

                if(pageNo==totalPages){
                    nexttriangle.style('opacity','0.5')
                    nexttriangle.on('click','')
                    .style('cursor','');
                }
                else if(pageNo==1){
                    prevtriangle.style('opacity','0.5')
                    prevtriangle.on('click','')
                    .style('cursor','');
                }

            }

            function prevLegend(){
                pageNo--;

                svg.selectAll("g.legendg").remove();
                svg.select('.pageNo').remove();
                svg.select('.prev').remove();
                svg.select('.next').remove();

                var startIndex=(pageNo-1)*legendPerPage;
                var endIndex=startIndex+legendPerPage;

                var seriesSubset=[],colorSubset=[];

                for(var i=0;i<data.series.length;i++){
                    if(i>=startIndex && i<endIndex){
                        seriesSubset.push(data.series[i]);
                        colorSubset.push(colors[i]);
                    }
                }  

                DrawLegendSubset(seriesSubset,colorSubset,legendPerPage,pageNo,totalPages);
            }
            
            function nextLegend(){
                pageNo++;

                svg.selectAll("g.legendg").remove();
                svg.select('.pageNo').remove();
                svg.select('.prev').remove();
                svg.select('.next').remove();

                var startIndex=(pageNo-1)*legendPerPage;
                var endIndex=startIndex+legendPerPage;

                var seriesSubset=[],colorSubset=[];

                for(var i=0;i<data.series.length;i++){
                    if(i>=startIndex && i<endIndex){
                        seriesSubset.push(data.series[i]);
                        colorSubset.push(colors[i]);
                    }
                }  

               DrawLegendSubset(seriesSubset,colorSubset,legendPerPage,pageNo,totalPages);
            }

查看更多
做自己的国王
3楼-- · 2019-05-09 15:44

I know this is a late question, but maybe this can still help you out.

I would create pagination in d3 by creating a second array that only contains the data you want shown at a particular time. This sliced array would come from your primary data array. By controlling where the array is sliced, you control the pagination.

I've created a simple example here with a long array divided into five-bar 'pages'.

http://jsfiddle.net/zNxgn/2/

查看更多
登录 后发表回答