2013-06-13 56 views
2

也許這是一個愚蠢的問題,但我是一個D3新手。我正在嘗試根據源鏈接權重更改強制佈局中的圓圈半徑。爲什麼在tick函數中可以訪問d.source.weight但不能在其他地方訪問?如何在強制佈局中訪問節點的weight屬性?

E.g.

force.on("tick", function() { 
    link.attr("x1", function(d) {console.log(d.source.name + " " + d.source.weight; return d.source.x; }) 
     .attr("y1", function(d) { return d.source.y; }) 
     .attr("x2", function(d) { return d.target.x; }) 
     .attr("y2", function(d) { return d.target.y; }); 

將正確的值返回給控制檯,但爲什麼附加圓圈時不能訪問這些屬性?

node.append("circle") 
    .attr("class", "node") 
    .attr("r", function(d) {return d.source.weight * 2;}); // breaks 

我覺得這是一個多D3的問題一個基本的JavaScript問題,但我不能找到它太大幫助。任何幫助表示讚賞。

回答

1

滴答函數不會改變當您設置.attr("r", ect)時會發生什麼;你改變你設置什麼:

鏈接

link.attr("x1", function(d) {console.log(d.source.name + " " + d.source.weight; return d.source.x; }) 

節點

node.append("circle") 
.attr("class", "node") 
.attr("r", function(d) {return d.source.weight * 2;}); // breaks 

我猜你工作過的this example。您可以通過閱讀source的第38-69行,同時參考API來了解節點的不同。雖然這可能是棘手的,有點難以理解;我會建議打開示例中的控制檯並稍微玩一下,以便更好地瞭解發生了什麼。

我建議你嘗試一些這些命令(使用鉻,所以你也可以很容易地檢查對象,看看屬性連接節點的數據,並鏈接了):

node.attr("r", function(d){ return 8; }) 
node.attr("r", function(d){ return d.weight; }) 

link.attr("class", "") 
link.attr("stroke", "yellow") 
+0

謝謝。我在文檔中看到,權重是節點的屬性,而不是鏈接。在node.append的情況下,我假設「d」是節點,在這種情況下,d.source.weight不起作用。然而,d.weight也不起作用,我不知道爲什麼(返回「未定義」)。 d.source.weight我猜想在link.attr內工作,因爲「d」是一個鏈接;所以我想它會將d.source解釋爲一個節點,允許您訪問d.source.weight?也許這些都是根本性的問題,但文件不清楚(從我能看到的)。 – justinm1

+0

另外,我不知道這個例子,但它與我想要做的相似。在那裏,他正在通過node.transition()方法設置radius屬性,這對我來說有點令人困惑(但我沒有對該功能做過多的工作)。 – justinm1

+0

.transition()只是添加動畫。如果你檢查'link'和'node',你會看到它們是一個對象數組。如果打開數組並查看其中的任何對象,則它們都具有__data__屬性,當您使用.attr(「r」,函數(d){...})時,d將相等。 –

1
node.append("circle") 
    .attr("class", "node") 
    .attr("r", function(d) {return d.weight * 2;}); // breaks 

剛刪除「.source」你正在使用這種情況下的節點函數(d){...}而不是鏈接。

相關問題