(これはここで尋ねられた質問のフォローアップの質問です。その質問では問題は完全には解決されておらず、これは一種の継続であるため、新しい質問を投稿します)
次のようなツリーを表すネストされたjson構造があります。
[{
"name": "flare",
"root": "true",
"children": [
{
"name": "analytics",
"nestedproperties": [
{ "attribute": "attribute1",
"type": "type1" },
{ "attribute": "attribute2",
"type": "type2" },
{ "attribute": "attribute3",
"type": "type3" }
],
"children": [
{
"name": "cluster",
"nestedproperties": [
{ "attribute": "attribute4",
"type": "type4"},
....
]
},
...
nestedproperties
ノードとその子を含む通常のツリー構造を表示するだけでなく、親ノードにリンクする円で 各要素を表現したいと考えてい ます。
この質問でアドバイスされているように、他のいくつかの質問と他の例への回答に従って、nestedproperties
ネストされたデータを引数として に渡すことで、各要素を表示することができました。コードのコア部分は次のようになります。.data()
var pii = nodeEnter.selectAll("circle.pii")
.data(function(d) {return d.nestedproperties; })
var piiEnter = pii.enter().append("svg:g")
.attr("class", "piinode")
.attr("transform", "translate(50,50)")
//.attr("transform", function(d, i) { return "translate(" + d.x + "," + d.y + ")"; }) // <<--- I cannot call this function because d.x and d.y does not exist
.call(forcepii.drag);
// Append the circle for the node
piiEnter.append("svg:circle")
.attr("class", "pii")
.attr("r", 25)
.style("fill", "blue")
.style("stroke", "#999999")
完全なコードはこのjsfiddleにあります。
問題は、ネストされたプロパティ内の要素を表す円がすべて重なり合って表示され、ドラッグできないことです。force.nodes()
ネストされた要素に適用する方法や、transform
それらのプロパティを使用してティックを行う方法がわかりません。
次のことを試してみると、「Uncaught TypeError: 未定義のプロパティ 'index' を設定できません」というメッセージが表示されます
forcepii.nodes(function(d) { return d.nestedproperties; })
//.links(links)
.gravity(0.05)
.charge(-1500)
.linkDistance(100)
.friction(0.5)
.linkStrength(function(l, i) {return 1; })
.size([w, h])
//.on("tick", tick)
.start();
これが結果の写真です。ご覧のとおり、円は互いに重なって描かれており、力は適用されていません。
助けてくれてありがとう!