2017-06-08 7 views
0

ich ein Netzwerk Graph Lots of nodesKnoten entfernen, die alleinstehend sind oder 2. Grades visjs haben

haben

Jetzt habe ich einige verbundenen Knoten und wie Sie die meisten der Knoten sehen kann nur einen verbundenen Knoten haben, die ihren Grad ist 1. Jetzt möchte ich solche Knoten entfernen, um das Durcheinander zu beseitigen. Seit zwei Tagen nicht mehr zu finden. Solche Hilfsfunktionen sind in der visjs-Dokumentation nicht verfügbar. Würde mich über Hilfe freuen.

Antwort

0

Dies könnte funktionieren:

var DEGREES_HIDDEN = 1; 

for (var node of nodes) { 
    node.cantLinks = 0; 

    for (var link of links) { 
     if (link.from == node.id || link.to == node.id) { 
      node.cantLinks++; 
     } 
    } 
} 
for (var node of nodes) { 
    if (node.cantLinks <= DEGREES_HIDDEN) { 
     node.hidden = true; 
    } 
} 

Knoten und Verbindungen sind Arrays nicht vis.DataSet, schaffe ich das letztere danach tun.

Sieht nicht sehr gut aus, aber es macht die Arbeit gut. Ich hoffe, Sie finden es nützlich.

2

Ich glaube, der Algorithmus von der ersten Antwort vorgeschlagen -von Macramole- (vor Updates) würde tatsächlich die nicht verbundenen Knoten (Grad 0), statt denen mit Grad 1 verstecken. würde ich wahrscheinlich nur über alle iterieren die Kanten im Netzwerk, während für jeden Knoten, der ein Endpunkt in der Kante ist, die Sie besuchen, Gradzähler vorhanden sind (Sie können diese Knoten erhalten, indem Sie die Werte edge.from und edge.to wie oben gezeigt verwenden). Sie würden den Gradzähler für einen Knoten erhöhen, wenn der Knoten bei dieser Suche durch die Kanten "getroffen" wird. Schließlich erhalten Sie den Gradwert für jeden Knoten im Netzwerk, an dem Sie entscheiden können, welche ausgeblendet werden sollen. Aktualisierung dieser Antwort jetzt meine vorgeschlagenen Code enthalten (Anmerkung: Knoten und Kanten sind über DataSet-Instanzen):

Beispielcode:

var nodeToDegrees = {}; // keeps a map of node ids to degrees 
var nodeFrom, nodeTo; 
for (edge in edges) { 
    nodeFrom = edge.from; 
    nodeTo = edge.to; 
    nodeToDegrees[nodeFrom] = nodeToDegrees[nodeFrom] ? nodeToDegrees[nodeFrom] + 1 : 0; 
    nodeToDegrees[nodeTo] = nodeToDegrees[nodeTo] ? nodeToDegrees[nodeTo] + 1 : 0; 
} 
for (node in nodes) { 
    if (nodeToDegrees[node.id] = 1) nodes.update([{node.id, hidden: true}]); 
} 
+1

Ja, Sie haben Recht, über der Algorithmus Verwendung als Ausgangs sein kann Punkt, aber OP sollte Zähler hinzufügen und verstecken, wo der Zähler ist 1 – macramole

+0

Ich habe meine Antwort – macramole

+0

Dank für den Kommentar aktualisiert. Ich habe jetzt auch meine Antwort aktualisiert, um einen Code zur Verfügung zu stellen, der den Unterschied veranschaulicht (keine zweistufige Schleife, die teurer ist) – pgoldweic

Verwandte Themen