Skip to content

Commit 255533d

Browse files
committed
Add node filtering feature to network visualization
Click a node to show only its connections. Click again or on background to reset. Filters nodes and edges to focus on specific network relationships.
1 parent 8012432 commit 255533d

File tree

1 file changed

+63
-2
lines changed

1 file changed

+63
-2
lines changed

docs/script.js

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,11 @@ function initCoattendanceNetwork() {
154154
const nodes = new vis.DataSet(scaledNodes);
155155
const edges = new vis.DataSet(scaledEdges);
156156

157+
// Store references to all nodes and edges for filtering
158+
const allNodeIds = new Set(scaledNodes.map(n => n.id));
159+
const allEdgeIds = new Set(scaledEdges.map(e => `${e.from}-${e.to}`));
160+
let currentlySelectedNodeId = null;
161+
157162
const data = {
158163
nodes: nodes,
159164
edges: edges
@@ -261,14 +266,70 @@ function initCoattendanceNetwork() {
261266
}
262267
}, 3000);
263268

269+
// Function to filter visualization to show only selected node and its connections
270+
function filterToNode(nodeId) {
271+
if (!nodeId) {
272+
// Reset: show all nodes and edges
273+
const allNodeIdsArray = Array.from(allNodeIds);
274+
allNodeIdsArray.forEach(id => {
275+
nodes.update({ id: id, hidden: false });
276+
});
277+
278+
// Remove all edges and re-add them
279+
edges.clear();
280+
edges.add(scaledEdges);
281+
282+
currentlySelectedNodeId = null;
283+
console.log('Reset to full view');
284+
return;
285+
}
286+
287+
currentlySelectedNodeId = nodeId;
288+
289+
// Find all edges connected to this node
290+
const connectedEdges = scaledEdges.filter(e =>
291+
e.from === nodeId || e.to === nodeId
292+
);
293+
294+
// Get all connected node IDs (the selected node + its neighbors)
295+
const connectedNodeIds = new Set([nodeId]);
296+
connectedEdges.forEach(e => {
297+
connectedNodeIds.add(e.from);
298+
connectedNodeIds.add(e.to);
299+
});
300+
301+
// Hide all nodes except connected ones
302+
allNodeIds.forEach(id => {
303+
nodes.update({
304+
id: id,
305+
hidden: !connectedNodeIds.has(id)
306+
});
307+
});
308+
309+
// Replace edges with only connected ones
310+
edges.clear();
311+
edges.add(connectedEdges);
312+
313+
console.log(`Filtered to node: ${nodeId} (showing ${connectedNodeIds.size} nodes, ${connectedEdges.length} edges)`);
314+
}
315+
264316
// Add event listeners for better interactivity
265317
coattendanceNetwork.on('click', function(params) {
266318
if (params.nodes.length > 0) {
267319
const nodeId = params.nodes[0];
268320
const node = coattendanceGraphData.nodes.find(n => n.id === nodeId);
269-
if (node) {
270-
console.log('Selected node:', node);
321+
322+
// If clicking the same node again, reset to full view
323+
if (currentlySelectedNodeId === nodeId) {
324+
filterToNode(null); // Reset view
325+
return;
271326
}
327+
328+
// Filter to show only this node and its connections
329+
filterToNode(nodeId);
330+
} else if (params.nodes.length === 0 && currentlySelectedNodeId) {
331+
// Clicking on background: reset to full view
332+
filterToNode(null);
272333
}
273334
});
274335

0 commit comments

Comments
 (0)