D3 sunburst图:设置arc.cornerRadius()会导致arcTween无效路径

时间:2015-01-08 11:22:06

标签: javascript svg d3.js sunburst-diagram

我尝试创建一个动态sunburst图表,它会缩放选定的弧线并隐藏其他弧线。这很有效,只要我避免使用大于0的arc.cornerRadius()。

我在(attrTween)arcTween函数中记录了生成的弧,输出对我来说似乎是正确的,但是跟随svg路径不同,其中第二个导致d3.min.js中的错误:5。

正确路径:

M0,58.528989440000004A58.528989440000004,58.528989440000004 0 1,1 0,-58.528989440000004A58.528989440000004,58.528989440000004 0 1,1 0,58.528989440000004M0,55A55,55 0 1,0 0,-55A55,55 0 1,0 0,55Z

错误路径:

M0,55.73917966222222A55.73917966222222,55.73917966222222 0 1,1 0,-55.73917966222222A55.73917966222222,55.73917966222222 0 1,1 0,55.73917966222222M0,55A55,55 0 1,0 0,-55A55,55 0 1,0 0,55Z

这是我设置半径的方法:

    var graphMaxRadius = 83;
    var innerBtnRadius = 55;
    var arc = d3.svg.arc()
                .startAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, xScale(d.x))); })
                .endAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, xScale(d.x + d.dx))); })
                .innerRadius(function(d) { return Math.max(innerBtnRadius, yScale(d.y)); })
                .outerRadius(function(d) { return Math.max(0, Math.min(yScale(d.y + d.dy), graphMaxRadius)); })
                .cornerRadius(function(d) { return 10;});

我的第一个猜测是,cornerRadius与隐藏弧相冲突,无效的svg发生,所以我尝试了各种尺寸。但一切都> 0导致错误,输出为:

    M0,55A55,55 0 1,1 0,-55A55,55 0 1,1 0,55M0,50.006635519999996A50.006635519999996,50.006635519999996 0 1,0 0,-50.006635519999996A50.006635519999996,50.006635519999996 0 1,0 0,50.006635519999996Z
    d3.min.js:5 Error: Invalid value for <path> attribute d="MNaN,NaNANaN,NaN 0 1,1 NaN,NaNLNaN,NaNANaN,NaN 0 0,1 NaN,NaNZ"
d3.min.js:5 (anonymous function)
d3.min.js:3 l
d3.min.js:1 Lt
d3.min.js:1 qt

这是我的arcTween函数(编辑与github issue上的mbostok相对应):

return function arcTween(d) {
        var xd = d3.interpolate(xScale.domain(), [d.x, d.x + d.dx]);
        var yd = d3.interpolate(yScale.domain(), [d.y, d.y + d.dy]);

        var selectionRadius = innerBtnRadius - 5;
        //radius -5 reduces width of inner circle and selection rim
        var yr = d3.interpolate(yScale.range(), [d.y ? selectionRadius : innerBtnRadius, radius-5]);

        return function(d, i) {
            return i
                ? function(t) { return arc(d); }
                : function(t) { xScale.domain(xd(t)); yScale.domain(yd(t)).range(yr(t)); return arc(d); };
        };
    }

请问,我接下来可以检查什么?

P.S。 sry,没有jsfiddle因为他们目前没有安装d3 v3.5 (我错过了数据导入)。我的代码在此处重复使用示例:zoomable sunburst

这是d3.js lib中发生错误的断点的屏幕截图,但我仍然不知道:

This is where the error occurs in the d3.js

1 个答案:

答案 0 :(得分:4)

请记住,cornerRadius是D3分区布局的一个相对较新的功能,因此可能仍然存在一些与之相关的错误。

但是,我的印象是你的问题不存在。

根据您关联的示例,我创建了一个小codepen

它与示例相同,只是它使用较小的数据集,并将数据保存在脚本本身中,而不是保存在JSON文件中。

此外,我整合了cornerRadius,检查了各种值 - 并且一切都像魅力一样,如下图所示。

我无法集成您的补间功能,因为其余代码中缺少一些位和和平。

因此,您需要检查并重写代码,尤其是与arcTween()相关的任何内容。

在我的示例中说明有效执行的屏幕截图:

cornerRadius是5:

enter image description here

cornerRadius是20:

enter image description here

cornerRadius是100:

enter image description here