2012-11-08 15 views
12

Ich muss ein benutzerdefiniertes d3-Layout erstellen, das in der Nähe einer Treemap liegt, jedoch in einem dreieckigen Stil. Hier ist ein Screenshot, so dass Sie verstehen können: enter image description here Pyramid layoutErstellen eines benutzerdefinierten d3-Layouts

Wie Sie sehen, es funktioniert recht ordentlich und passt mein Bedürfnis. es zu kodieren, habe ich den Code auf dem treemap Layout-Code basiert:

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); 
}; 

Mein Problem ist, dies zu tun, ich habe die d3.v2.js Datei musste direkt bearbeiten, weil einige private Funktionen nicht zugänglich sind von outisde, in meinem Fall d3_layout_hierarchyRebind. Offensichtlich weiß ich, es ist nicht die beste Praxis überhaupt, aber ich kann nicht meine Datei in einem separaten Skript externalize d3_layout_hierarchyRebindis von außen nicht sichtbar machen.

Ich weiß nicht, ob es ein d3- oder JavaScript-Problem ist, aber ich würde gerne wissen, ob Sie mir helfen könnten, dieses kleine Problem zu lösen.

Vielen Dank im Voraus!

+1

Es sieht aus wie d3.js wurde nicht entworfen, um extern definierte Layouts zu haben. Sie könnten das von Ihnen geschriebene Layout in einen benutzerdefinierten Build von d3.js integrieren. Ich sehe keinen anderen Weg, dies zu tun. – fuzic

+0

Gute Frage und Kommentar - dasselbe Problem beobachtet. Es beginnt mit dem Erhalt einer d3_identity bereits ... – andig

+0

Wie @ZachB darauf hingewiesen, können Sie ein Layout erstellen, ohne den D3-Namespace zu verwenden. Ein Layout ist nur eine konfigurierbare Funktion, die Daten empfängt und transformierte Daten zurückgibt, genau das ist Ihre Funktion. –

Antwort

2

Kopieren und fügen Sie einfach die Funktion d3.layout.pyramid in eine neue Datei ein und benennen Sie die Funktionen nach Bedarf um, damit sie nicht in Konflikt mit der Bibliothek d3 steht. Wahrscheinlich wird alles privat sein, so dass nur die äußerste Funktion umbenannt werden muss. Sie müssen es wahrscheinlich nicht mit "d3" benennen. Das heißt, das sollte funktionieren:

var myPyramidLayout = function() { 
    ... 
} 
Verwandte Themen