我正在寻找开发一个圆环图。每个新数据集在另一个内部都显示为同心环。

http://jsfiddle.net/NYEaX/101/

我尝试对数据中的值求和,并用它来帮助开发比例算法,以确保每条弧线都不会超过一个循环。

这部分管理同心环。

getArc: function(){
            var that = this;

            var radiusArray = [100, 80];

            function getRadiusRing(i){
                return that.radius-(i*20);
            }
            var thickness = 15;

            var arc = d3.svg.arc()
                    .innerRadius(function(d){
                        return getRadiusRing(d.index);
                    })
                    .outerRadius(function(d){
                        return getRadiusRing(d.index)+thickness;
                    })
                    .startAngle(function(d, i){
                        return d.startAngle;
                    })
                    .endAngle(function(d, i){
                        return d.endAngle;
                    });
            return arc;
        }


但我认为端角计算存在缺陷。如果您启用更多数据-尽管同心环正确形成,但它们在整个图表中的可疑弧长却缠绕在整个图表上?

setData: function(data){
            var diameter = 2 * Math.PI * this.radius;
            var localData = new Array();

            var segmentValueSum = 0;
            $.each(data[0].segments, function( ri, va) {
                segmentValueSum+= va.value;
            });

            $.each(data[0].segments, function(ri, value) {

                var segmentValue = value.value;

                var fraction = segmentValue/segmentValueSum;

                var arcBatchLength = fraction*2*Math.PI;
                var arcPartition = arcBatchLength;

                var startAngle = 0;
                var endAngle = ((ri+1)*arcPartition);

                data[0].segments[ri]["startAngle"] = startAngle;
                data[0].segments[ri]["endAngle"] = endAngle;
                data[0].segments[ri]["index"] = ri;
            });

            localData.push(data[0].segments);

            return localData[0];
        }




试图建立图表如下所示



我已经增强了图表,但在图例,圆环和值的放置和更新方面仍然存在问题。为什么保留旧数据?
http://jsfiddle.net/NYEaX/123/

如果有更多或更少的数据-标签放置不正确

 //draw labels
            valueLabels = value_group.selectAll("text.value").data(reversedata)
            valueLabels.enter().append("svg:text")
            .attr("class", "value")
            .attr("transform", function(d) {
                var rings = counts;

                return "translate("+(that.radius+55)/rings+", 0)";
            })
             .attr("dx", function(d, i){
                return 19*i;            })
            .attr("dy", function(d, i){
                return -5;
            })
            .attr("text-anchor", function(d){
                return "start";
            }).text(function(d){
                return d.value;
            });

            valueLabels.transition().duration(300).attrTween("d", arcTween)
            valueLabels.exit().remove();

最佳答案

更换

    var endAngle = ((ri+1)*arcPartition);


通过

    var endAngle = startAngle + arcPartition;

10-08 16:59