D3强制布局:如何设置每个节点的大小?
Posted
技术标签:
【中文标题】D3强制布局:如何设置每个节点的大小?【英文标题】:D3 force layout: How do I set the size of every node? 【发布时间】:2014-01-10 11:49:44 【问题描述】:我正在使用令人惊叹的 D3JS 来构建图表。该图已呈现,但我希望我的节点具有每个节点的大小。
数据是这样的:
来源:“安东尼霍普金斯”,目标:“伍迪艾伦”,价值:3
代码如下:
var links = graph.links;
var nodes = ;
links.forEach(function(link)
link.source = nodes[link.source] || (nodes[link.source] = name: link.source);
link.target = nodes[link.target] || (nodes[link.target] = name: link.target);
);
var width = 1200,
height = 1500;
var force = d3.layout.force()
.nodes(d3.values(nodes))
.links(links)
.size([width, height])
.linkDistance(50)
.charge(-200)
.on("tick", tick)
.start();
var svg = d3.select("#network").append("svg")
.attr("width", width)
.attr("height", height);
var link = svg.selectAll(".link")
.data(force.links())
.enter().append("line")
.attr("class", "link");
var node = svg.selectAll(".node")
.data(force.nodes())
.enter().append("g")
.attr("class", "node")
.style("stroke-width", function(d) return (d.value)*5; )
.on("mouseover", mouseover)
.on("mouseout", mouseout)
.call(force.drag);
node.append("circle")
.attr("r", 5);
node.append("text")
.attr("x", 12)
.attr("dy", ".35em")
.text(function(d) return d.name; );
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("transform", function(d) return "translate(" + d.x + "," + d.y + ")"; );
function mouseover()
d3.select(this).select("circle").transition()
.duration(750)
.attr("r", 10)
;
function mouseout()
d3.select(this).select("circle").transition()
.duration(750)
.attr("r", 5)
;
有什么想法吗?
【问题讨论】:
【参考方案1】:我假设您要根据.value
设置每个节点的大小(即半径)。你这样做:
node.append("circle")
.attr("r", function(d) return d.value * 3; );
您显然可以调整因子,或者改用比例。
【讨论】:
已经试过了。这就是我得到的:Error: Invalid value for <circle> attribute r="NaN"
我什至添加了一个parseInt(d.value)
但徒劳无功。
如果让一个完整的工作示例运行不可行,至少发布function(d) console.log(d); console.log(d.value)
时数据结构的样子。大多数d3布局方法都会创建一个包含原始数据的d.value
对象;如果您的原始数据也是具有 .value 属性的对象,您可能需要使用 d.value.value
。【参考方案2】:
我也在寻找这个并试图解决它一点点。
我认为你的数据库中的每个对象都必须是一个唯一的 id(或者只是迭代)。然后在node
对象的代码中,您可以编写如下内容:
var node = svg.selectAll(".node")
.data(graph.nodes)
.attr("r", function(d)
if (d.value === myUniqueId)
return 3;
else
return 10;
)
这里的"r"
用于无线电。value
是我数据库中的一个名称(它可以是任何你想要的)。在那里您可以更改节点大小。
我知道这不是一个干净的代码,但我只是一个新手。
希望对您有所帮助!
【讨论】:
以上是关于D3强制布局:如何设置每个节点的大小?的主要内容,如果未能解决你的问题,请参考以下文章