Published
Edited
Mar 11, 2020
Importers
2 stars
Insert cell
Insert cell
Insert cell
point = (start = 0, step = 1) => {
return {
nodes: [
{ id: offset(0, start, step) },
],
links: [],
};
}
Insert cell
line = (n, start = 0, step = 1) => {
return {
nodes: range(n).map(i => {
return { id: offset(i, start, step) };
}),
links: range(n - 1).map(i => {
return { source: offset(i, start, step), target: offset(i + 1, start, step) };
}),
};
}
Insert cell
circle = (n, start = 0, step = 1) => {
return {
nodes: range(n).map(i => {
return { id: offset(i, start, step) };
}),
links: range(n).map(i => {
return { source: offset(i, start, step), target: offset((i + 1) % n, start, step) };
}),
};
}
Insert cell
star = (n, start = 0, step = 1) => {
return {
nodes: [
{ id: offset(0, start, step) },
...range(n).map(i => {
return { id: offset(i + 1, start, step) };
}),
],
links: range(n).map(i => {
return { source: offset(0, start, step), target: offset(i + 1, start, step) };
}),
};
}
Insert cell
wheel = (n, start = 0, step = 1) => {
const starGraph = star(n, start, step);
const circleGraph = circle(n, start + 1, step);
return merge(starGraph, circleGraph);
}
Insert cell
complete = (n, start = 0, step = 1) => {
return {
nodes: range(n).map(i => {
return { id: offset(i, start, step) };
}),
links: range(n).flatMap(i => {
return range(n).filter(j => j > i).map(j => {
return { source: offset(i, start, step), target: offset(j, start, step) };
});
}),
};
}
Insert cell
triangleLattice = (n, start = 0, step = 1) => {
const xLineGraphs = range(n).map(i => {
return line(n - i, start + 10 * (i + 1), step);
});
const yLineGraphs = range(n).map(i => {
return line(n - i, start + 10 + i, step * 10);
});
const zLineGraphs = range(n).map(i => {
return line(n - i, start + 10 + n - i - 1, step * (10 - 1));
});
const lineGraphs = [...xLineGraphs, ...yLineGraphs, ...zLineGraphs];
return lineGraphs.reduce(merge, empty());
}
Insert cell
squareLattice = (n, start = 0, step = 1) => {
const xLineGraphs = range(n).map(i => {
return line(n, start + 10 * (i + 1), step);
});
const yLineGraphs = range(n).map(i => {
return line(n, start + 10 + i, step * 10);
});
const lineGraphs = [...xLineGraphs, ...yLineGraphs];
return lineGraphs.reduce(merge, empty());
}
Insert cell
sierpinskiTriangle = (n, start = 0, step = 1) => {
const makeGraphFromTriangle = triangle => {
return {
nodes: [
{ id: `${triangle[0]}` },
{ id: `${triangle[1]}` },
{ id: `${triangle[2]}` },
],
links: [
{ source: `${triangle[0]}`, target: `${triangle[1]}` },
{ source: `${triangle[1]}`, target: `${triangle[2]}` },
{ source: `${triangle[2]}`, target: `${triangle[0]}` },
],
}
};
const makeGraphFromTriangles = triangles => {
return triangles.map(makeGraphFromTriangle).reduce(merge, empty());
};
const splitTriangle = triangle => {
return [
[`${triangle[0]}`, `(${[triangle[0], triangle[1]].sort()})`, `(${[triangle[0], triangle[2]].sort()})`],
[`${triangle[1]}`, `(${[triangle[0], triangle[1]].sort()})`, `(${[triangle[1], triangle[2]].sort()})`],
[`${triangle[2]}`, `(${[triangle[0], triangle[2]].sort()})`, `(${[triangle[1], triangle[2]].sort()})`],
];
};
const splitTriangles = triangles => {
return triangles.flatMap(triangle => splitTriangle(triangle));
};
let triangles = [
[
offset(0, start, step),
offset(1, start, step),
offset(2, start, step),
],
];
if (n === 0) {
return makeGraphFromTriangles(triangles);
}
for (let i = 0; i < n; i++) {
triangles = splitTriangles(triangles);
}
return makeGraphFromTriangles(triangles);
}
Insert cell
Insert cell
empty = () => {
return {
nodes: [],
links: [],
};
}
Insert cell
merge = (graph1, graph2) => {
return {
nodes: uniq([...graph1.nodes, ...graph2.nodes].map(node => node.id)).map(id => {
return { id: id };
}),
links: [...graph1.links, ...graph2.links],
};
}
Insert cell
multiply = (graph, n = 1) => {
if (n === 0) {
return empty();
}
if (n === 1) {
return graph;
}
graph = {
nodes: range(n).flatMap(i => {
return graph.nodes.map(node => {
return { ...node, id: `${node.id}#${i}` };
});
}),
links: range(n).flatMap(i => {
return graph.links.map(link => {
return { ...link, source: `${link.source}#${i}`, target: `${link.target}#${i}` };
});
}),
};
return graph;
}
Insert cell
hyper = (graph, n = 0) => {
if (n === 0) {
return graph;
}
for (let i = 0; i < n; i++) {
const separator = i === 0 ? '#' : '';
graph = {
nodes: graph.nodes.flatMap(node => {
return [
{ ...node, id: `${node.id}${separator}0` },
{ ...node, id: `${node.id}${separator}1` },
];
}),
links: [
...graph.nodes.flatMap(node => {
return { source: `${node.id}${separator}0`, target: `${node.id}${separator}1` };
}),
...graph.links.flatMap(link => {
return [
{ ...link, source: `${link.source}${separator}0`, target: `${link.target}${separator}0` },
{ ...link, source: `${link.source}${separator}1`, target: `${link.target}${separator}1` },
];
}),
],
};
}
return graph;
}
Insert cell
Insert cell
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