gpt4 book ai didi

javascript - 可折叠力导向图上的 D3.js 标题

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:46:02 26 4
gpt4 key购买 nike

所以我一直在研究基于以下 example 的可折叠力导向图.

我正在尝试从中推进并为每个节点添加标题。我关注了类似的 answer在 stackoverflow 上,但我无法将该答案的解决方案实现到上面的示例和其他类似解决方案中。

请有人能指出我正确的方向。

实现前请参阅下面的项目代码。

enter image description here

JS

var w = 600,
h = 600,
radius = 10,
node,
link,
root;

var force = d3.layout.force()
.on("tick", tick)
.charge(function(d) { return -500; })
.linkDistance(function(d) { return d.target._children ? 100 : 50; })
.size([w, h - 160]);

var svg = d3.select("body").append("svg")
.attr("width", w)
.attr("height", h);

root = words[0]; //set root node
root.fixed = true;
root.x = w / 2;
root.y = h / 2 - 80;
update();

function update() {
var nodes = flatten(root),
links = d3.layout.tree().links(nodes);

// Restart the force layout.
force
.nodes(nodes)
.links(links)
.start();

// Update the links…
link = svg.selectAll(".link")
.data(links);

// Enter any new links.
link.enter().insert("svg:line", ".node")
.attr("class", "link")
.attr("x1", function(d) { 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; });

// Exit any old links.
link.exit().remove();

// Update the nodes…
node = svg.selectAll("circle.node")
.data(nodes)
.style("fill", color);

node.transition()
.attr("r", radius);

node.append("title")
.text(function(d) { return d.name; });

// Enter any new nodes.
node.enter().append("svg:circle")
.attr("class", "node")
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", radius)
.style("fill", color)
.on("click", click)
.call(force.drag);

// Exit any old nodes.
node.exit().remove();
}

function tick() {
link.attr("x1", function(d) { 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.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
}

// Color leaf nodes orange, and packages white or blue.
function color(d) {
if(d._children){
return "#95a5a6";
}else{
switch(d.group) {
case 'r': //adverb
return "#e74c3c";
break;
case 'n': //noun
return "#3498db";
break;
case 'v': //verb
return "#2ecc71";
break;
case 's': //adjective
return "#e78229";
break;
default:
return "#9b59b6";
}
}
}

// Toggle children on click.
function click(d) {
if (d.children) {
d._children = d.children;
d.children = null;
} else {
d.children = d._children;
d._children = null;
}
update();
}

// Returns a list of all nodes under the root.
function flatten(root) {
var nodes = [], i = 0;

function recurse(node) {
if (node.children) node.size = node.children.reduce(function(p, v) { return p + recurse(v); }, 0);
if (!node.id) node.id = ++i;
nodes.push(node);
return node.size;
}

root.size = recurse(root);
return nodes;
}

CSS

circle.node {
cursor: pointer;
stroke: #34495e;
stroke-width: 2px;
box-sizing: border-box;
stroke-location: inside;
}

line.link {
fill: none;
stroke: #34495e;
stroke-width: 1.5px;
}

HTML

<!DOCTYPE html>
<body>
<script src="http://d3js.org/d3.v2.min.js?2.9.6"></script>
<script>

var words = [
{
"group":"n",
"word":"main node",
"children":[
{
"group":"n",
"name":"sub node 1"
},
{
"group":"n",
"name":"sub node 2"
},
{
"group":"n",
"name":"sub node 3"
},
{
"group":"v",
"name":"sub node 4"
},
{
"group":"s",
"name":"sub node 5"
},
{
"group":"s",
"name":"sub node 6"
},
{
"group":"s",
"name":"sub node 7"
},
{
"group":"s",
"name":"sub node 8"
},
{
"group":"s",
"name":"sub node 9"
},
{
"group":"s",
"name":"sub node 10"
},
{
"group":"s",
"name":"sub node 11"
},
{
"group":"r",
"name":"sub node 12",
"children":[
{
"group":"r",
"name":"sub sub node 1"
},
{
"group":"r",
"name":"sub sub node 2"
},
{
"group":"r",
"name":"sub sub node 3"
}
]
}
]
}
]
</script>
</body>

JSFiddle

最佳答案

像这样给节点添加标题。

title = svg.selectAll("text.title")    
.data(nodes);

title.enter()
.append("text") //In your code you used title instead of text
.attr("class", "title")
.text(function(d) { return d.name; });

title.exit().remove();

请注意,标题应附加在圆节点之后。否则标题可能会被 chop 。

同时在 tick 函数中更新标题的位置。

 title.attr("transform", function(d){ return "translate("+d.x+","+d.y+")"; });

这是 jsfiddle

关于javascript - 可折叠力导向图上的 D3.js 标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26747638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com