Javascript d3.js力布局仅垂直应用

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值绘制,随后的力计

我正在用d3进行数据可视化。给你一些背景

  • 该图包含大约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?我们找不到访问链接数据的方法。