Javascript d3.js力布局仅垂直应用
我正在用d3进行数据可视化。给你一些背景Javascript d3.js力布局仅垂直应用,javascript,d3.js,data-visualization,force-layout,timeline,Javascript,D3.js,Data Visualization,Force Layout,Timeline,我正在用d3进行数据可视化。给你一些背景 该图包含大约400个节点(所有数据都是从多个节点加载的) 相互连接的json文件) 它们都在时间轴(x轴)中按年份映射 y轴上的位置完全随机 节点具有所有不同的大小 现在我的问题是: 如何在y轴上分布节点,使其不重叠? 您可以在上签出完整的源代码(正在进行的工作-当前在real database分支上) 这是它当前外观的屏幕截图: 基本上,在tick()函数中,将节点数组的x值重置为您想要的值(可能与年份有关),节点和链接将以这些x值绘制,随后的力计
- 该图包含大约400个节点(所有数据都是从多个节点加载的) 相互连接的json文件)
- 它们都在时间轴(x轴)中按年份映射
- y轴上的位置完全随机
- 节点具有所有不同的大小
如何在y轴上分布节点,使其不重叠? 您可以在上签出完整的源代码(正在进行的工作-当前在
real database
分支上)
这是它当前外观的屏幕截图:
基本上,在tick()函数中,将节点数组的x值重置为您想要的值(可能与年份有关),节点和链接将以这些x值绘制,随后的力计算也将从这些值开始
force.on("tick", function() {
// Adjust to what you want nodePos to be, here I'm just doing it by index
graph.nodes.forEach (function(nodePos,i) {
nodePos.x = i * 15;
//nodePos.x = xscale (data[i].year); // or whatever
})
// then normal node/link layout
我用blt909的这个标准力导向的例子来展示一种方法-->
PS如果你有很多项和很少的离散x值,最好先给它们一点摆动的空间(即它们包含在x中的一个范围,而不是一个值),然后慢慢缩小这个范围。否则节点将彼此“卡在”后面
2016年3月2日编辑:
您好,Alvaro,graph.nodes本质上是您的链接数据,因为这些是作为数据附加到显示节点的对象
因此,如果我设置了一个标尺,并按照每个基准点随机插入一年:
var dom = [1994,2014];
var xscale = d3.scale.linear().domain(dom).range([20,400]);
graph.nodes.forEach (function(datum) {
datum.year = dom[0] + Math.floor (Math.random() * (dom[1] - dom[0]));
});
然后,我们可以像这样限制每个节点基准的x位置:
graph.nodes.forEach (function(d,i) {
//d.x = i * 15;
d.x = xscale(d.year);
})
(正如我所说,如果你有很多节点,而且只有几年的时间,你最好限制在一个范围内,然后在接下来的每一次滴答声中缩小这个范围)
谢谢,这是一个很好的帮助!我们正在使用一个日期格式化程序只获取从日期开始的年份:
(新日期(d.date\u birth).getFullYear())
。如何将其应用于nodePos.x=I*15代码>?我们找不到访问链接数据的方法。