Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 创建自定义d3布局_Javascript_Layout_D3.js_Treemap - Fatal编程技术网

Javascript 创建自定义d3布局

Javascript 创建自定义d3布局,javascript,layout,d3.js,treemap,Javascript,Layout,D3.js,Treemap,我需要创建一个定制的d3布局,它有点接近树形图,但采用三角形样式。以下是一个屏幕截图,您可以了解: 正如你所看到的,它工作起来非常整洁,符合我的需要。 为了对其进行编码,我将代码基于treemap布局代码: d3.layout.pyramid= function () { var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = 0; function popul

我需要创建一个定制的d3布局,它有点接近树形图,但采用三角形样式。以下是一个屏幕截图,您可以了解:

正如你所看到的,它工作起来非常整洁,符合我的需要。 为了对其进行编码,我将代码基于treemap布局代码:

d3.layout.pyramid= function () {
    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = 0;

    function populate (nodes, currentHeight, currentHeightPadded, currentBase, currentSumedWeight) {
       ...
    }

    function populate_layers (layer, nodes,currentHeight,currentLength, currentSumedArea,currentSumedWeight) {
       ...
    }

    function pyramid(d) {
       var nodes = hierarchy(d), root = nodes[0];

       populate(root.children.slice(),0,0,0,0);
       return nodes;
    }  

    pyramid.padding = function(x) {
       if (!arguments.length) return padding;
       padding = x;
       return pyramid;
    };

    pyramid.size = function(x) {
       if (!arguments.length) return size;
       size = x;
       return pyramid;
    };

    return d3_layout_hierarchyRebind(pyramid, hierarchy);
};
我的问题是,要这样做,我必须直接编辑
d3.v2.js
文件,因为有些私有函数无法从outisde访问,在我的例子中是
d3\u layout\u hierarchyRebind
。 显然,我知道这根本不是最好的做法,但我无法将我的文件外部化到单独的脚本中,因为从外部看不到

我不知道这是否是d3或javascript相关的问题,但我想知道您是否可以帮助我解决这个小问题


谢谢,这是事先准备好的

只需将d3.layout.pyramid函数复制并粘贴到新文件中,并根据需要重命名函数,这样它就不会与d3库冲突。可能所有内容都是私有的,因此只需要重命名最外层的函数。您可能不必将其命名为“d3”。也就是说,这应该是可行的:

var myPyramidLayout = function () {
    ...
}

看起来d3.js只是没有被设计成具有外部定义的布局。您可以将编写的布局合并到d3.js的自定义构建中。我看没有其他方法可以做到这一点。很好的问题和评论-观察到同样的问题。它从已经获得d3_标识开始……正如@ZachB所指出的,您可以创建一个布局,而无需使用d3名称空间。布局只是一个可配置的函数,它接收数据并返回转换后的数据,这正是您的函数所做的。