Lines of Thought
A subway diagram makes a bargain: sacrifice literal distance so connections become easy to follow. That bargain works for trains, but also for any network whose paths, junctions, and shared passages matter more than its native coordinates.
The diagram escaped the city
Read the design history in the New York Transit Museum'sVignelli at 50 exhibit; see the formal design rules in thesurvey of automated metro-map layouts, and the metaphor's expansion inMetroSets.
Follow a route through the shared stations
This fictional system has normalized station positions. Semiotic fits them to the plot, keeps the shared trunks parallel, and uses the supplied line order. Toggle the fallback to see the same data treated as an undecorated graph.
Trace:Hover a station or line segment.
import { NetworkCustomChart } from "semiotic/network" import { transitDiagramLayout } from "semiotic/recipes" // Complete x/y positions are fitted to the available plot. // Optional edge points and lineOrder values provide art direction. <NetworkCustomChart nodes={stations} edges={connections} layout={transitDiagramLayout} layoutConfig={{ lineAccessor: "line", cornerRadius: 10, lineOrder: ["ember", "blue", "green"] }} accessibleTable /> A watershed arrives with no station positions
Headwaters become origins, confluences become interchanges, and the reservoir carries the merged routes. Follow each color to see where the water came from. The diagram emphasizes connections; use a geographic map for distances and directions.
id · label · kind
edges
source · target · lines
no x
no y
no rank
no waypoints
The only layout hint is rootId: "Delta", supplied as chart configuration rather than written into every row. Remove it and the layout selects a deterministic peripheral endpoint itself.
// These nodes have ids and labels, but no x/y coordinates. const watershedNodes = [ { id: "Snowfield", label: "Snowfield headwater" }, { id: "North Fork", label: "North Fork" }, { id: "Delta", label: "Delta / ocean" } ] <NetworkCustomChart nodes={watershedNodes} edges={watershedEdges} layout={transitDiagramLayout} layoutConfig={{ rootId: "Delta", direction: "right-to-left" }} accessibleTable /> // Missing positions trigger a deterministic topology layout, // crossing-reduction sweeps, and octilinear connection routing. Start automatically, then refine the route
Automatic layout gives a new graph a consistent starting arrangement. Try it to see whether routes and junctions help explain the network, then add positions, waypoints or line ordering where they improve the reading.
Geometry
layoutMode detects complete x/y automatically. Use automaticto ignore them, or authored to request them and fall back safely when they are incomplete.
Network meaning
lineAccessor accepts one line or several line descriptors per edge. lineOrder stabilizes parallel trunks; rootId anddirection orient fallback layouts.
Drawing
Tune lineWidth, lineGap, cornerRadius, station radii, labels, padding, colors, and authored intermediate points without replacing the layout.