Published
Edited
Aug 19, 2022
2 stars
Insert cell
Insert cell
Insert cell
rendererPre = new Sigma.Sigma(graphPre, document.getElementById('sigma-container-pre'));
Insert cell
Insert cell
Insert cell
rendererPost = new Sigma.Sigma(graphPost, document.getElementById('sigma-container-post'));
Insert cell
Insert cell
Insert cell
function difference(setA, setB) {
let _difference = new Set(setA)
for (let elem of setB) {
_difference.delete(elem)
}
return _difference
}
Insert cell
function intersection(setA, setB) {
let _intersection = new Set()
for (let elem of setB) {
if (setA.has(elem)) {
_intersection.add(elem)
}
}
return _intersection
}
Insert cell
Insert cell
nodesPreSet = new Set(nodesPre)
Insert cell
nodesPostSet = new Set(nodesPost)
Insert cell
Insert cell
PreNotPost = difference(nodesPreSet,nodesPostSet)
Insert cell
Insert cell
PostNotPre = difference(nodesPostSet,nodesPreSet)
Insert cell
Insert cell
InBoth = intersection(nodesPreSet,nodesPostSet)
Insert cell
Insert cell
edgesPreSet = new Set(edgesPre)
Insert cell
edgesPostSet = new Set(edgesPost)
Insert cell
Insert cell
EdgesPreNotPost = difference(edgesPreSet,edgesPostSet)
Insert cell
Insert cell
EdgesInBoth = intersection(edgesPreSet,edgesPostSet)
Insert cell
Insert cell
graphPreDensity = metrics.density.undirectedDensity(graphPre)
Insert cell
graphPostDensity = metrics.density.undirectedDensity(graphPost)
Insert cell
avgdegree = (graph) => {
let totalDegree = 0
graph.forEachNode( (n,attr) => { totalDegree += graph.degree(n); })
return totalDegree/graph.nodes().length;
}
Insert cell
graphPreAvgDegree = avgdegree(graphPre)
Insert cell
graphPostAvgDegree = avgdegree(graphPost)
Insert cell
Insert cell
GPreStats = {
let n = 0
let stats = []
while (n < 100) {
n++
let RG = gen.random.erdosRenyi(Graph, {order: 544, approximateSize: 1405})
stats.push({density: metrics.density.undirectedDensity(RG), avgdegree: avgdegree(RG)})
}
return stats
}
Insert cell
viewof randomPreStats = aq.from(GPreStats).view()
Insert cell
GPostStats = {
let n = 0
let stats = []
while (n < 100) {
n++
let RG = gen.random.erdosRenyi(Graph, {order: 430, approximateSize: 910})
stats.push({density: metrics.density.undirectedDensity(RG), avgdegree: avgdegree(RG)})
}
return stats
}
Insert cell
viewof randomPostStats = aq.from(GPostStats).view()
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
randomPreStats.filter(d => d.avgdegree > 5.1).numRows()/randomPreStats.numRows()
Insert cell
randomPostStats.filter(d => d.avgdegree > 4.2).numRows()/randomPostStats.numRows()
Insert cell
Insert cell
Insert cell
Graph = require('graphology')
Insert cell
Sigma = require('https://bundle.run/sigma@2.0.0')
Insert cell
forceAtlas2 = require("https://bundle.run/graphology-layout-forceatlas2@0.8.1")
Insert cell
graphologyLayout = require("https://bundle.run/graphology-layout@0.4.0")
Insert cell
noverlap = require("https://bundle.run/graphology-layout-noverlap@0.4.1")
Insert cell
metrics = require('https://bundle.run/graphology-metrics@1.18.2')
Insert cell
gen = require('https://bundle.run/graphology-generators@0.11.1')
Insert cell
Insert cell
assignLayouts = (graph) => {
graphologyLayout.random.assign(graph); // Needs a starting layout for forceAtlas to work
let sensibleSettings = forceAtlas2.inferSettings(graph);
forceAtlas2.assign(graph, {iterations: 100, settings: sensibleSettings});
noverlap.assign(graph)
}
Insert cell
assignLayouts(graphPre)
Insert cell
assignLayouts(graphPost)
Insert cell
Insert cell
graphPre = {
let graph = new Graph({type: 'undirected'})
nodesPre.forEach(n => {
graph.addNode(n);
});
edgesPre.forEach(e => {
try {
graph.addEdge(e["Source Name"],e["Target Name"]);
} catch (e) {}
});
return graph
}
Insert cell
graphPost = {
let graph = new Graph({type: 'undirected'})
nodesPost.forEach(n => {
graph.addNode(n);
});
edgesPost.forEach(e => {
try {
graph.addEdge(e["Source Name"],e["Target Name"]);
} catch (e) {}
});
return graph
}
Insert cell
edges = FileAttachment("sdfb_edgelist.csv").csv()
Insert cell
edgesPre = edges.filter(e => e["Start Year"] < 1570);
Insert cell
edgesPost = edges.filter(e => e["Start Year"] >= 1570);
Insert cell
nodesPre = [...new Set(edgesPre.map(e => {return [e["Source Name"], e["Target Name"]];}).flat())]
Insert cell
nodesPost = [...new Set(edgesPost.map(e => {return [e["Source Name"], e["Target Name"]];}).flat())]
Insert cell
Insert cell
metrics.centrality.degree.assign(graphPre)
Insert cell
Insert cell
assignAttributes = (graph) => {
graph.forEachNode((n,attr) => {
// graph.setNodeAttribute(n, "size", attr.degreeCentrality);
graph.setNodeAttribute(n, "label", n);
graph.setNodeAttribute(n, "color", colors[attr.community]);
});
}
Insert cell
graphPre.nodes().map(n => graphPre.getNodeAttributes(n))
Insert cell
assignAttributes(graphPre)
Insert cell
assignAttributes(graphPost)
Insert cell
Insert cell
louvain = require('https://bundle.run/graphology-communities-louvain@1.5.3')
Insert cell
louvain.assign(graphPre);
Insert cell
louvain.assign(graphPost)
Insert cell
colors = ['#e41a1c','#377eb8','#4daf4a','#984ea3','#ff7f00','#ffff33','#a65628','#f781bf']
Insert cell
Insert cell
import { aq, op } from '@uwdata/arquero'
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more