2012-03-28 85 views
13

我正在嘗試使用d3.layout.force來製作一個有力的圖表,並且我需要容器可以調整大小 - 也就是說,我希望能夠根據以下內容計算適當的費用和linkDistance值:大小,還是有d3爲我做了一些神奇的方式。根據尺寸收費 - d3版面佈局

我試過了(鏈接:http://jsfiddle.net/VHdUe/6/),它只使用節點。我將電荷設置爲一個基於節點數量的值,該節點將適合於它傾向於成形的圓的半徑。

的解決方案適用於一些中等大小的容器,但如果你點擊調整了幾下,你可以看到它並沒有真正爲各種規模的工作...

唯一的辦法我可以看到的是使用svg縮放轉換,這會使我的元素大小變得不利。任何其他選項?

PS:我看過http://mbostock.github.com/d3/talk/20110921/bounding.html(對D3 force directed layout with bounding box的回答),但我寧願有一個基於重力的解決方案,而不是邊界框。

+0

http://bl.ocks.org/mbostock/1129492 – weltschmerz 2016-01-27 04:46:03

回答

20

除了chargelinkDistance,您還有gravity。如果您希望圖形保持與佈局大小相同的相對密度,那麼您將需要縮放電荷和重力。這些是確定blob總體大小的主要兩個計算力量。有關更多詳細信息,請參見my force layout talk

我嘗試了幾種不同的版本,而這一次似乎工作得很好:

var k = Math.sqrt(nodes.length/(width * height)); 

layout 
    .charge(-10/k) 
    .gravity(100 * k) 

這裏nodes.length/(width * height)是線性正比於圖形密度:由佈局的區域劃分節點的區域。充電力遵循inverse-square law,這可以解釋爲什麼平方根很好地工作。 D3的「重力」是一個虛擬的彈簧,它隨着距佈局中心的距離線性縮放,因此當圖形變得更密時,這也會增加重力,並且阻止節點逃離邊界框。

+0

這看起來太棒了,當然也足夠覆蓋我們的案例。我會將它擴展爲明智的鏈接距離,但這應該很簡單。謝謝! – XwipeoutX 2012-04-02 23:57:13

+0

@XwipeoutX,可否請您分享一下啓發式結果,以調整鏈接距離?謝謝! – skyork 2013-07-29 12:10:49

+0

對不起,@skyork - 我們最終放棄了對我們正在做的事情的支持,因此我沒有任何東西給你。我們使用的數據對於其他任何事情都不是什麼好事,「哦,看起來很有光澤」,所以不幸的是我沒有花太多的額外時間。 – XwipeoutX 2013-07-30 12:25:04