Presidents × Legislation × Events
Force-directed graph linking administrations to the laws they signed and the events that hit during their terms
Each grey circle is a presidential administration. Each square is a piece of legislation; each triangle is a world event. Colour goes red → amber → green along sentiment (−1 extreme negative → 0 neutral → +1 extreme positive), with hue interpolated in HCL space so the mid-point reads as a clean amber rather than a muddy brown.
Links: solid grey lines connect presidents to events that happened during their term and to legislation they signed. Dashed red lines show presidents who publicly opposed legislation from other terms; solid green lines show cross-term support. Line thickness tracks link strength.
Drag a node to pin it; scroll/pinch to zoom; hover for details.
Sentiment values are editorial first-pass estimates anchored on contemporaneous polling and NBER/FBI/public indicators. They are stored in plain CSVs under data/sentiment/ — legislation.csv and events.csv — and are intended to be refined as we swap in derived sentiment from GDELT/Media Cloud and issue-specific polling. See the Methodology page for full caveats.
Reading the graph
- Cluster shape — presidents and their in-term items form radial lobes. Events and legislation sit at ~equal distance from their president node because
forceLinkdistances are equal across in-term links. - Cross-term edges (dashed red / dotted green) pull certain legislation between two presidents, shortening the distance to the supporter/opposer and visually connecting administrations that took positions on someone else’s law.
- Drag a president to pin it; the rest of the graph reorganizes around that fixed point. Double-click a node to release the pin.
Data sources
Stored in two CSVs under data/sentiment/:
legislation.csv— hand-curated list of major 1999-to-present US federal legislation with contemporaneous sentiment estimates, the president who signed, and (optional) cross-termsupported_by/opposed_bykeys.events.csv— world and domestic events with a sentiment estimate and severity tag. Already used by the Economic and Media Sentiment pages for event-line overlays.
The graph is assembled by R/build_network.R and emitted as data/sentiment/network.json, consumed by D3 on this page. Re-running the build is cheap: no external API calls, just CSV → JSON.
Where sentiment comes from (and should come from)
Current sentiment values are editorial — a single author’s reading of contemporaneous polling, NBER/FBI indicators, and published retrospective commentary. The intention is that the numbers evolve as we plug in derived signals:
- GDELT tone around the signing date (already cached on the Media Sentiment page) gives a media-framing signal per legislation.
- Media Cloud volume lets us weight the signal by how much coverage each law received.
- Issue-specific polling (Pew, Gallup issue tracking) would ground the approval estimate.
Until then, the CSVs are plain-text and sit under version control — each score has a notes field explaining the anchor. PRs welcome.