2016-08-31 8 views
11

के साथ एक निश्चित लिंक दूरी कैसे सेट करते हैं, सभी एपीआई उदाहरण अभी भी v3 के लिए प्रतीत होते हैं। मैं समझने के लिए एक निश्चित दूरी के लिंक, जैसे के साथ एक बल ग्राफ़ बनाने के लिए कैसे कोशिश कर रहा हूँ: http://bl.ocks.org/d3noob/5141278आप डी 3 वी 4

मैं link_distance को देखा लेकिन यकीन है कि यह कैसे लागू करने के लिए नहीं: https://github.com/d3/d3-force/blob/master/README.md#link_distance

की तरह एक ग्राफ बनाना इस:

// .force("link", d3.forceLink().distance(20).strength(1)) 
    // .force("linkDistance", 20) 
    // .force("link", d3.forceLink().id(function(d) { return d.id; })) 
:

let simulation = d3.forceSimulation() 
     .force("link", d3.forceLink().id(function(d) { return d.id; })) 
     .force("charge", d3.forceManyBody().strength(-150)) 
     .force("center", d3.forceCenter(width/2, height/2)); 

मैं जैसे विभिन्न कॉम्बो की कोशिश की

लेकिन कोई भाग्य नहीं!

तो ऐसा लगता है कि link_distance को ठीक नहीं किया जा सकता है? शक्ति और की अपनी एक परिणाम (दूरी, जो कुछ भी है)

तो मैं कैसे आवेदन करूं strength और distance d3 v4 में लिंक करने के लिए? क्या यह सिमुलेशन या कुछ और पर लागू होता है?

+0

न तो डी 3 v3 और न ही v4 के लिए निश्चित लिंक दूरी जैसी कोई चीज़ नहीं है। एक स्पष्टीकरण के लिए मेरे [उत्तर] (http://stackoverflow.com/a/34376334/4235784) पर [* "d3.js लिंक पर एक प्रभाव ग्राफ में लिंकडिस्टेंस पर प्रभाव प्रभाव" /] (/ q/34355120) पर एक नज़र डालें v3 के लिए। यद्यपि बहुत कुछ बदल गया है, खासतौर पर बल लेआउट के लिए, यह वही सिद्धांत v4 के लिए भी सच है। यदि लिंक बराबर लंबाई के रूप में दिखाई देते हैं, तो यह मौका है और अधिकतर अन्य पैरामीटर और आसपास के बल से प्रभावित होता है। – altocumulus

+0

ठीक है धन्यवाद। लेकिन मैं अभी भी स्पष्ट नहीं हूं कि v4 एपीआई के साथ लिंक डिस्टेंस या लिंकस्टेंथ कमांड कैसे सेट करें। क्या मैं उन्हें 'd3.forceSimulation' या किसी अन्य चीज़ पर सेट करता हूं? – dcsan

+0

हां, यह v4 बनाम v3 की तलाश में एक चुनौती थी। मैं दो चीजों की सिफारिश करता हूं: 1) वी 4-केवल http://blockbuilder.org/search#d3version=v4 पर खोज रहा है (मुझे देर तक यह नहीं मिला)। 2) मेरा गैर-तुच्छ डी 3 बल ग्राफ: http://bl.ocks.org/bill-mybiz/dfe5b70ad9b469e23b8820790fa53109। मैंने इसे गैर-तुच्छ संदर्भ संदर्भ के लिए बनाया क्योंकि यह v3 दस्तावेज में आने के लिए थोड़ा निराशाजनक था। इसमें नोड समूह (केवल साधारण मंडल नहीं), es6 वर्ग संरचना, आदि का उपयोग करके गतिशील जोड़/निकालें नोड्स हैं। इसमें दूरी निर्धारित करना, साथ ही साथ अन्य सेटिंग्स का समूह भी शामिल है। – ibgib

उत्तर

17

आप लगभग v4 में दूरी को बदलने के करीब हैं! इस परिवर्तन की जाँच करें, यह मेरे लिए काम करता है:

var simulation = d3.forceSimulation() 
    .force("link", d3.forceLink().id(function(d) { return d.id; }).distance(100).strength(1)) 
    .force("charge", d3.forceManyBody()) 
    .force("center", d3.forceCenter(width/2, height/2)); 
-1

आप बिना force('center')

let simulation = d3.forceSimulation() 
    .force("link", d3.forceLink().id(function(d) { return d.id; })) 
    .force("charge", d3.forceManyBody().strength(-150)); 
1

कोशिश कर सकते हैं आप बहुत करीब रहे हैं ... यह चेक करें, इस कोड मेरे लिए काम करता ..

नोट: मुझे इस कोड GetNodeDefaults (d.label) के साथ नोड लेबल के आधार पर गतिशील रूप से लिंक की लंबाई मिल रही है। लिंक्सडिस्टेंस यानी, यह 100 या 200 या 300 आदि हो सकता है,

var forceLink = d3 
    .forceLink().id(function (d) { 
     return d.id; 
    }) 
    .distance(function (d) { 
     return GetNodeDefaults(d.label).linkDistance; 
    }) 
    .strength(0.1); 

var simulation = d3.forceSimulation() 
    .force("link", forceLink) 
    .force("charge", d3.forceManyBody().strength(function (d, i) { 
     var a = i == 0 ? -2000 : -1000; 
     return a; 
    }).distanceMin(200).distanceMax(1000)) 
    .force("center", d3.forceCenter(width/2, height/2)) 
    .force("y", d3.forceY(0.01)) 
    .force("x", d3.forceX(0.01)) 
    .on("tick", ticked); 
संबंधित मुद्दे