Published
Edited
Jun 9, 2021
1 star
Insert cell
Insert cell
Insert cell
Insert cell
current = setup.update(permutations[sorting]())
Insert cell
currentlist = current.map(i => graph.nodes[i].id)
Insert cell
graph
Insert cell
graph = ({ 'nodes': groups.n, 'links': groups.l.map(e => ({ source: e.source, target: e.target, value: e.count })) })
Insert cell
// note: here the graph expect source and target to be 0-based and correspond to existing nodes.
import { communities as groups } from '@taniki/regionales2021-minint-graph'
Insert cell
permutations = orders(graph)
Insert cell
orders(graph)
Insert cell
matrix = Array.from(graph.nodes, (_, i) =>
d3.range(graph.nodes.length).map(j => ({ x: j, y: i, z: 0 }))
);
Insert cell
orders = ({ nodes, links }) => {
const n = nodes.length;
// const matrix = Array.from(nodes, (_, i) =>
// d3.range(n).map(j => ({ x: j, y: i, z: 0 }))
// );
const index = nodes.map((d, i) => ("id" in d ? d.id : i));
const l = [];

for (const node in nodes) nodes.count = 0;
links.forEach(link => {
const i = link.source
const j = link.target
if (!("value" in link)) link.value = 1;
matrix[i][j].z += link.value;
matrix[j][i].z += link.value;
matrix[i][j].z += link.value;
matrix[j][i].z += link.value;
nodes[i].count += link.value;
nodes[j].count += link.value;
l.push({ source: i, target: j, value: link.value });
});

const adjacency = matrix.map(row => row.map(c => c.z));

const graph = reorder
.graph()
.nodes(nodes)
.links(l)
.init();

let dist_adjacency;

const leafOrder = reorder.optimal_leaf_order();
//.distance(science.stats.distance.manhattan);

function computeLeaforder() {
const order = leafOrder(adjacency);
order.forEach((lo, i) => (nodes[i].leafOrder = lo));
return nodes.map(n => n.leafOrder);
}

function computeLeaforderDist() {
if (!dist_adjacency) dist_adjacency = reorder.graph2valuemats(graph);
const order = reorder.valuemats_reorder(dist_adjacency, leafOrder);
order.forEach((lo, i) => (nodes[i].leafOrderDist = lo));
return nodes.map(n => n.leafOrderDist);
}

function computeBarycenter() {
const barycenter = reorder.barycenter_order(graph);
const improved = reorder.adjacent_exchange(graph, ...barycenter);
improved[0].forEach((lo, i) => (nodes[i].barycenter = lo));
return nodes.map(n => n.barycenter);
}

function computeRCM() {
const rcm = reorder.reverse_cuthill_mckee_order(graph);
rcm.forEach((lo, i) => (nodes[i].rcm = lo));
return nodes.map(n => n.rcm);
}

function computeSpectral() {
const spectral = reorder.spectral_order(graph);
spectral.forEach((lo, i) => (nodes[i].spectral = lo));
return nodes.map(n => n.spectral);
}

const orders = {
none: () => d3.range(n),
name: () =>
d3.range(n).sort((a, b) => d3.ascending(nodes[a].id, nodes[b].id)),
// count: () => d3.range(n).sort((a, b) => nodes[b].count - nodes[a].count),
group: () =>
d3
.range(n)
.sort(
(a, b) =>
d3.ascending(nodes[a].cluster, nodes[b].cluster) ||
d3.ascending(nodes[a].id, nodes[b].id)
),
leafOrder: computeLeaforder,
leafOrderDist: computeLeaforderDist,
barycenter: computeBarycenter,
rcm: computeRCM,
spectral: computeSpectral
};

return orders;
}
Insert cell
Insert cell
reorder = require('reorder.js@^2.0.2')
Insert cell
Insert cell
d3 = require("d3@6")
Insert cell
import { select } from "@jashkenas/inputs"
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