2016-11-22 28 views
1

我正在繪製有向圖:JSBin。我希望圖形最初可以用力顯示,但用戶可以自由移動節點。有兩種選擇,其中任何一種對我都很好:一旦顯示強制圖形,禁用力

1)一旦顯示圖形,我希望能夠將任何節點拖到任何位置,不會干預;鏈接的長度將自動調整

2)一旦顯示圖形,我希望能夠拖動節點,鏈接的長度可以始終保持不變,但我不希望來介入以自動改變其他節點的位置。

我試圖修改.charge(-300),但它不能很好地工作,任何人都可以幫助嗎?

編輯1:

我加force.nodes([])JSBin,但預期它不工作...

+0

可能有兩個辦法從什麼是馬克的回答表明不同。選擇哪一個在很大程度上取決於1)當力量仍在運行時或剛剛停止時,你想要拖動行爲嗎? 2)力量佈局是否會在初始停頓後重新加熱? – altocumulus

回答

4

我要解決這個:

1)一旦顯示圖形,我希望能夠拖動任意節點任何位置,部隊不干預;鏈路的長度會自動調整

第一:

當你讓你的矩形或圓形的節點,然後給它一個像這樣的類:

var circlesOrRects = svg.append("g").selectAll(".foo") 
.data(force.nodes()) 
.enter() 
.append("path") 
.attr("class", "foo")//give it a class 

力向圖後,下一步停止,修復如下所示的節點:

var force = d3.layout.force() 
    .nodes(d3.values(nodes)) 
    .links(links) 
    .size([width, height]) 
    .linkDistance(150) 
    .charge(-300) 
    .on("tick", tick) 
    .start() 
    .on("end", function(p) { 
     //using the class for selecting nodes. 
     d3.selectAll(".foo").each(function(d){ 
     d.fixed=true;//thsi will fix the node. 
     }); 
    }); 

現在在力停止後,您可以將節點拖到任何地方。

請注意,結束事件將被觸發,一旦強制阿爾法變爲0,只有這樣才能修復節點。

工作代碼here

+1

有一個缺點但是:這不會阻止力量在每次拖拽時被重新加熱,它只是修復了節點的位置。如果佈局中有許多節點,這可能會對整體性能產生顯着影響。 – altocumulus

+0

耶你提出的許多節點可能是一個問題。 – Cyril

0

手動停止力向圖,你可以簡單地調用force.stop()

你所描述的是當你做出任何改變時阻止強制重新運行。有幾種方法可以做到這一點,我認爲最好的做法是從有向圖中「分解」節點。

要做到這一點只需撥打force.nodes([])。現在,強制有向圖正在使用空圖,並且您可以繼續使用您的節點。要在初始配置後,這樣做,你會想:

force.on("end", function() { 
    force.nodes([]); 
}); 
+0

值得一提的是,這隻適用於D3 v3,然而,這是OP要求的。在v3中,武力自己的阻力在每次拖曳事件中重新加熱力量。在v4中,力佈局與拖動行爲分離,導致拖動事件不會重新加熱佈局。我在使用v4時看到至少有一個問題要求完全相反:*「爲什麼我的模擬不能在拖動時運行?」* – altocumulus

+0

@altocumulus非常感謝您的澄清。我還沒有機會使用v4的力量 - 沒有意識到行爲已經改變。 – Ian

+0

感謝您的回答,但我沒有看到'force.on'的位置(「end ...'。我把它放在JavaScript腳本的末尾,它不工作... – SoftTimur