2012-11-08 21 views
12

मुझे एक कस्टम डी 3 लेआउट बनाना है जो कुछ हद तक एक ट्रेमैप के करीब है लेकिन त्रिकोणीय शैली में है। यहाँ एक स्क्रीनशॉट है, ताकि आप समझ सकते हैं: enter image description here Pyramid layoutएक कस्टम डी 3 लेआउट बनाना

आप देख सकते हैं, यह बहुत साफ काम करता है और मेरी जरूरत फिट बैठता है। यह कोड के लिए, मैं ट्री-मैप लेआउट कोड पर कोड आधारित है:

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_layout_hierarchyRebind। स्पष्ट रूप से मुझे पता है कि यह सबसे अच्छा अभ्यास नहीं है लेकिन मैं अपनी फ़ाइल को एक अलग स्क्रिप्ट में d3_layout_hierarchyRebindis बाहरी रूप से दिखाई नहीं दे रहा हूं।

मुझे नहीं पता कि यह एक डी 3- या जावास्क्रिप्ट से संबंधित मुद्दा है, लेकिन मैं जानना चाहता हूं कि क्या आप इस छोटी सी समस्या को हल करने में मेरी मदद कर सकते हैं।

अग्रिम धन्यवाद!

+1

ऐसा लगता है कि d3.js को बाहरी रूप से परिभाषित लेआउट के लिए डिज़ाइन नहीं किया गया था। आप d3.js. के कस्टम निर्माण में लिखे गए लेआउट को शामिल कर सकते हैं। मुझे ऐसा करने का कोई और तरीका नहीं दिख रहा है। – fuzic

+0

अच्छा प्रश्न और टिप्पणी- एक ही समस्या देखी गई। यह पहले से ही d3_identity प्राप्त करने से शुरू होता है ... – andig

+0

जैसा कि @ZachB ने इंगित किया है, आप डी 3 नेमस्पेस का उपयोग किये बिना लेआउट बना सकते हैं। एक लेआउट केवल एक कॉन्फ़िगर करने योग्य फ़ंक्शन है जो डेटा प्राप्त करता है और परिवर्तित डेटा लौटाता है, यह वही है जो आपका कार्य करता है। –

उत्तर

2

बस d3.layout.pyramid फ़ंक्शन को एक नई फ़ाइल में कॉपी और पेस्ट करें और आवश्यक कार्यों का नाम बदलें ताकि यह d3 लाइब्रेरी से टकराव न हो। संभावना है कि सबकुछ निजी होगा, इसलिए केवल बाहरी कार्य को फिर से बदलना होगा। आपको शायद इसे "d3" पर नामित करने की आवश्यकता नहीं होगी। ऐसा कहना है, यह काम करना चाहिए:

var myPyramidLayout = function() { 
    ... 
}