vis.js 动态显示边缘

Posted

技术标签:

【中文标题】vis.js 动态显示边缘【英文标题】:vis.js dinamically show edges 【发布时间】:2022-01-09 17:10:09 【问题描述】:

我正在学习如何使用 vis.js 来显示网络,我想知道是否可以使用滑块根据边缘属性(例如其权重)动态显示/隐藏边缘。

我的意思是,与 here 显示的滑块相同,但取决于边缘权重,是一种过滤器。

提前感谢您的建议。

【问题讨论】:

【参考方案1】:

有几个选项可以实现这一点。 DataView 似乎最有效。

隐藏的边缘

可以使用每条边上的hidden 属性隐藏边,如https://visjs.github.io/vis-network/docs/network/edges.html 中所述。这种方法循环遍历边缘并根据它们的权重属性隐藏/显示它们。生成图表时会考虑隐藏边缘的物理特性,因此在滑块更改时不会重新排列。

这个例子可以在https://jsfiddle.net/Lpofugbc/找到。

数据视图

DataView 可用于过滤 DataSet 并仅提供所需的边,有关 DataView 的更多信息可以在 https://visjs.github.io/vis-data/data/dataview.html 找到。

这种方法会从网络中移除边缘,因此未显示的边缘将不会考虑其物理特性。当滑块移动时,图表可能会重新排列以最好地显示显示的边缘。如果您不介意网络重新排列,这似乎是最好的方法,而且也是最有效的,因为只有相关的边缘用于生成网络。

这个例子可以在https://jsfiddle.net/vu6ptfjr/2/和下面找到。

// create an array with nodes
var nodes = new vis.DataSet([
   id: 1, label: "Node 1" ,
   id: 2, label: "Node 2" ,
   id: 3, label: "Node 3" ,
   id: 4, label: "Node 4" ,
   id: 5, label: "Node 5" ,
]);

// create an array with edges
// Each edge is given a weight
var edges = new vis.DataSet([
   from: 1, to: 3, weight: 1 ,
   from: 1, to: 2, weight: 2 ,
   from: 2, to: 4, weight: 2 ,
   from: 3, to: 3, weight: 2 ,
   from: 2, to: 5, weight: 3 ,
   from: 3, to: 5, weight: 3 ,
   from: 4, to: 5, weight: 4 ,
   from: 1, to: 5, weight: 5 
]);

// Create variable for sliderValue, set to initial value
// Update HTML slider and display with initial value
var sliderValue = 2;
document.getElementById('slider').value = sliderValue;
document.getElementById('sliderValueDisplay').innerHTML = sliderValue;

// Create a DataView which is a filtered version of the DataSet
var edgesView = new vis.DataView(edges, 
    filter: function(edge)
    // Return true if the edge should be displayed
    return (edge.weight <= sliderValue);
  
);

// create a network
var container = document.getElementById("mynetwork");
var data = 
  nodes: nodes,
  // Set edges to DataView which is filtered, rather than the DataSet
  edges: edgesView,
;
var options = ;
var network = new vis.Network(container, data, options);

// Handler event when slider changes
document.getElementById('slider').oninput = function() 
  // Get the value of the slider and store it
  sliderValue = this.value;
  
  // Refresh the data view so the update to sliderValue takes affect 
  edgesView.refresh();
  
  // Display the selected value next to slider
  document.getElementById('sliderValueDisplay').innerHTML = sliderValue;
#mynetwork 
  width: 600px;
  /* Height adjusted for Stack Overflow inline demo */
  height: 160px;
  border: 1px solid lightgray;
<script src="https://visjs.github.io/vis-network/standalone/umd/vis-network.min.js"></script>
<div class="slidecontainer">
  <input type="range" min="0" max="5" value="0" class="slider" id="slider">
  Max Weight: <span id="sliderValueDisplay"></span>
</div>
<div id="mynetwork"></div>

【讨论】:

感谢您的详细解释和详细说明!

以上是关于vis.js 动态显示边缘的主要内容,如果未能解决你的问题,请参考以下文章

使用 vis.js 的时间轴组中所有项目的高度相同

Vis.js 时间轴 - 如何在不嵌套的情况下折叠组

如何使用 vis.js 强制边缘方向?

如何为 ScrollView 设置图像而不是淡化边缘?

面临启用导航按钮和使用 vis.js 在时间线图中获取数据的问题

vis.js绘图库的一个BUG以及源码修正