【问题标题】:Arc Chart - with various segment indentions/heights弧形图 - 具有各种段缩进/高度
【发布时间】:2014-02-12 17:32:58
【问题描述】:

最新的弧线图 1 - http://jsfiddle.net/NYEaX/699/ ***

我正在开发一组弧形图。

http://jsfiddle.net/NYEaX/90/

^这是我拥有的最新版本。

我的第一个问题 - 是当一组新数据进入时 - 动画出现闪烁。

我也有兴趣改变每段的内半径/外半径。

我可以在下面的代码中为 i 提供一个模数吗

getArc: function(){
            var that = this;

            var arc = d3.svg.arc()
                    .innerRadius(function(d, i){
                        return that.radius;
                    })
                    .outerRadius(function(d){
                        var maxHeight = 100;
                        var ratio = (d.height/maxHeight * 100)+that.radius;
                        return ratio;
                    })
                    .startAngle(function(d, i){
                        return d.startAngle;
                    })
                    .endAngle(function(d, i){
                        return d.endAngle;
                    });

            return arc;
        }

我已经更正了应用程序。

我现在已经设法在各个细分市场上进行了转变。

http://jsfiddle.net/NYEaX/91/

但是,我现在尝试使用段的值来改变它们的长度。所以我想创建一个看起来像图片示例的弧。

这是我得到的最新示例。

http://jsfiddle.net/NYEaX/92/

这是代码 - 我不确定如何通过 startAngle/endAngle 获取所有弧的总长度以提供正确的长度以完成解决方案。

setData: function(data, isSorted){

            var diameter = 2 * Math.PI * this.radius;

            var localData = new Array();

            var displacement = 0;
            var oldBatchLength = 0;


            var totalSum = 0;
            $.each(data, function(index, value) {
                $.each(value.segments, function( ri, va) {
                    totalSum+= va.height;
                });
            });


            $.each(data, function(index, value) {               
                var riseLevels = value.segments;
                //var riseLevelCount = riseLevels.length;

                //var arcBatchLength = 2*Math.PI;
                //var arcPartition = arcBatchLength/riseLevelCount;

                    $.each(riseLevels, function( ri, value ) {

                        if(oldBatchLength !=undefined){             
                            displacement+=oldBatchLength;
                        }

                        var segmentValue = value.height;

                        //var ratio = value.height/totalSum;

                        var arcBatchLength = segmentValue;//ratio*2*Math.PI;
                        var arcPartition = arcBatchLength/totalSum;                     


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

                        if(index!=0){
                            startAngle+=displacement;
                            endAngle+=displacement;
                        }

                        riseLevels[ri]["startAngle"] = startAngle;
                        riseLevels[ri]["endAngle"] = endAngle;
                        riseLevels[ri]["index"] = ri;   



                        oldBatchLength = arcBatchLength;
                    });
                        //oldBatchLength = arcBatchLength;      

                localData.push(riseLevels);
            });

            var finalArray = new Array();

            $.each(localData, function(index, value) {
                $.each(localData[index], function(i, v) {
                    finalArray.push(v);
                });
            });

            console.log("finalArray", finalArray);

            return finalArray;

        }

【问题讨论】:

  • 闪烁是因为“反弹”补间。而且您似乎已经按段改变了外半径?
  • @旧国。请不要创建答案来提供有关您的问题的更多信息;相反,编辑问题(编辑页面的链接位于问题的底部)。当人们在活动列表中看到一个包含三个答案的问题时,他们认为不需要更多关注!
  • 我添加了一个基于电影测量的动画图表版本 - jsfiddle.net/NYEaX/137

标签: javascript d3.js automatic-ref-counting


【解决方案1】:

我已经更接近于参考它们的值来固定弧长。但是圆弧的位移不正确。

http://jsfiddle.net/NYEaX/100/

如果更多数据暴露在灰色弧线中 - 它会中断。如果您切换到绿色/黄色/绿色弧线,则类似。

我已尝试进一步简化应用程序以尝试找出问题。

$.each(data[0].segments, function(ri, value) {
                //console.log("ri", ri);

                if(oldBatchLength !=undefined){             
                    displacement+=oldBatchLength;
                }

                var segmentValue = value.value;

                var fraction = segmentValue/segmentValueSum;

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

                //console.log("arcBatchLength", arcBatchLength);
                //console.log("oldBatchLength", oldBatchLength);
                //console.log("displacement", displacement);

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

                if(ri!=0){
                    displacement-=arcBatchLength;//not sure its right

                    startAngle+=displacement;
                    endAngle+=displacement;
                }

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

                oldBatchLength = arcBatchLength;
            });

【讨论】:

  • 我得到的弧长彼此成比例正确 - 但弧的位移仍然不正确。 jsfiddle.net/NYEaX/104
  • 我已经设法让位移正确。我很想知道我是否可以将图表分流以形成四分之一弧来表示数据 - 而不是占据整个圆周。 jsfiddle.net/NYEaX/109
  • 设法制作了一个版本,其中数据在圆的 1/3 上表示 - 因此它可以作为时间图表的二进制数据 - jsfiddle.net/NYEaX/110
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2022-07-19
  • 1970-01-01
相关资源
最近更新 更多