2013-12-23 151 views
2

我想知道是否可以稍微更改d3.layout中的包裝算法。也就是說,我想知道如果不是在觸及父節點的位置放置一個具有最高值的子節點,可以將它放在中間。現在看起來好像所有的孩子都是通過螺旋進入父母身邊的小孩。控制D3圓圈包佈局算法中圓圈的順序

我希望這不是太混亂。我會很樂意澄清什麼是不明確的。

回答

3

這是可能的。

你只需要在d3.js替換此代碼:此代碼

function d3_layout_packSort(a, b) { 
    return a.value - b.value; 
    } 

function d3_layout_packSort(a, b) { 
    return -(a.value - b.value); 
    } 

(只是一個符號的變化)

最大的社交圈也不會在父母的中心,但他們往往會靠近中心。我的理解是,你不需要在中心的確切位置,只是近似的,所以我希望這會滿足你的想法。

下圖說明了與常規和改性d3.js,並排側獲得圓形組件例如:

Regular and modified packing

I的種類往往喜歡改性填料更多。 :)所以我想這是一個好主意。檢查它與數據的外觀。

您可以在這裏訪問這些示例:regular,modified

我修改過的d3.js是here

讓我知道你是否還有其他問題。

+2

夥計,就是這樣。非常感謝。唯一的不需要改變d3.js中的函數,而只需在包聲明中添加.sort(比較器)即可。爲我工作! – Kaster

0

D3是開源的,所以你可以做任何你喜歡的修改。對於包裝佈局,將元素放置在包含形狀的中心將需要進行可能相當大的修改,儘管這樣做會進一步限制可用空間。

也就是說,在邊緣有一個圓圈,其餘的空間直到另一個邊緣可以用於其他圓圈。如果圓形在中心,則直到邊緣的空間更少,因此圓形空間更少。爲了保持大小和數據之間的視覺關聯,中心的圓圈必須更小,等等。

所以你說的不是一個簡單的修改,而是實現的算法的改變。根據你想要做什麼,用D3的另外一種佈局實現這一點可能會更容易。

+0

感謝您的回答。你知道任何紙張或筆記與實施算法描述?我找不到它,但說實話,從來沒有超過Google搜索的第10頁。 – Kaster

+0

我不知道任何。我的直覺是它應該是相當直接的,因爲你只需要改變圓的位置並在計算剩餘空間時考慮到這一點,但我從未做過這樣的事情,所以我可能是錯的。 –

+0

噢,好的。不管怎麼說,還是要謝謝你。缺乏答案也是一個答案。公認。 – Kaster