Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
D3.js 基于节点度的d3力布局图约束_D3.js_Force Layout - Fatal编程技术网

D3.js 基于节点度的d3力布局图约束

D3.js 基于节点度的d3力布局图约束,d3.js,force-layout,D3.js,Force Layout,我有一个force布局,其中可能包含大量节点,对于图形来说太大了,无法响应地进行渲染。我认为提高系统性能的一种方法是,当节点数量过大时,根据输入和输出程度删除节点,从而修剪图形 重新计算节点和链接列表有点麻烦,因为链接与节点数组中的索引相关,因此所有链接都需要重新构建 将单个节点标记为排除(类似于某些节点固定的方式),并让布局算法跳过这些节点,似乎更为优雅。这将允许我动态地选择要显示的图的子集,同时为每个节点保留尽可能多的状态(例如,位置) 有人实现过这样的东西吗 更新: 我试图实现过滤建议,但

我有一个force布局,其中可能包含大量节点,对于图形来说太大了,无法响应地进行渲染。我认为提高系统性能的一种方法是,当节点数量过大时,根据输入和输出程度删除节点,从而修剪图形

重新计算节点和链接列表有点麻烦,因为链接与节点数组中的索引相关,因此所有链接都需要重新构建

将单个节点标记为排除(类似于某些节点固定的方式),并让布局算法跳过这些节点,似乎更为优雅。这将允许我动态地选择要显示的图的子集,同时为每个节点保留尽可能多的状态(例如,位置)

有人实现过这样的东西吗

更新

我试图实现过滤建议,但遇到了一个有趣的错误。
filter
方法似乎返回了一个未实现
enter
的对象:

qChart apply limit:2
NODES BEF: [Array[218], enter: function, exit: function, select: function, selectAll: function, attr: function…]
NODES AFT: [Array[210], select: function, selectAll: function, attr: function, classed: function, style: function…]
Uncaught TypeError: Object [object Array] has no method 'enter' 
运行以下代码以从
BEF
AFT

nodeSubset = nodeSubset.filter(function(n) { return (n.sentCount() <= limit); });   

nodeSubset=nodeSubset.filter(函数(n){return(n.sentCount()您可以将
selection.filter()
选项与
node.weight
属性结合使用

您通常会做的是:

var node = svg.selectAll(".node")
    .data(graph.nodes)
    .enter().append("circle")
在这里,您可以执行以下操作:

var node = svg.selectAll(".node")
    .data(graph.nodes)
    .filter(function(d){return d.weight>3})
    .enter();
您可能还必须使用相同的方法从图形中删除指向这些节点的链接

编辑如果要直接在数据数组中将节点标记为活动节点,则只需过滤提供的数据(并对链接执行相同操作)


如果您想通过计算每个节点的权重来实现这一点,我仍然建议您在将节点和链接传递到图形之前进行此操作,并将节点标记为活动节点或未遵循特定条件,然后根据活动节点过滤链接。否则,您将不得不加载整个力导向布局以获得权重t然后过滤数据以重新加载力定向图。

我试图实现您的建议,但遇到了一个问题,如对问题的编辑所示。基本上,
filter()
方法返回一些没有
enter()的内容
defined.Sorry.你能构建一个JSFIDLE吗?好的,这是有意义的,但是这会阻止force布局接触被排除的数据对象吗?或者force仍然会尝试定位它们吗?它们将在force布局中,所以会计算它们的位置。我想这意味着我需要在force而不是DOM级别应用过滤器。我我正试图消除部队布局的混乱,使其表现得更好。
var node = svg.selectAll(".node")
    .data(force.nodes().filter(function(d) { return d.active; }));

var link = svg.selectAll(".link")
      .data(force.links().filter(function(d) { 
          var show =  d.source.active && d.target.active;
          if (show)
              console.log("kept", d);
          else
              console.log("excluded", d);
          return show;
      }) );