Methods
[ work in progress ]
1Network
1.1Atlas
Unit of analysis
The fundamental unit is the episode: one of the 73 numbered sections into which Gravity's Rainbow is divided across its four parts. Episodes range from 611 lexical tokens (1.11) to 16,508 (3.11); this variation matters because longer episodes are not intrinsically more connective than shorter ones, and the weighting scheme described below compensates for episode length.
Entity recognition and mention tracking
I maintain a roster of named human characters (currently 178) identified through close reading, cross-referenced against Weisenburger's companion and the Pynchon Wiki. For each episode, I record every unambiguous mention of each character: full names, surnames, given names, pronouns resolved manually where the referent is clear from context, and established nicknames (e.g. 'Pirate' for Prentice, 'Säure' for Bummer). Ambiguous references and unnamed characters ('the girl', 'a soldier') are excluded. The count for a character in a given episode is the total number of such resolved mentions.
This is deliberately a measure of textual presence rather than narrative presence: a character who is discussed extensively in absentia registers just as strongly as one who acts on the page. The distinction matters for Pynchon, whose absent characters (Slothrop in Part 4, Blicero for much of Parts 2 and 3) often dominate the discourse of episodes they never physically enter.
Edge construction and weighting
Two characters share an edge if both appear in at least one common episode. The edge weight is constructed to reflect not merely how often two characters co-occur but how concentrated that co-occurrence is. For each shared episode e, I compute each character's share of total tracked mentions in e and take the minimum of the two shares. Summing these minima across all shared episodes produces the edge weight:
w(i, j) = Σe ∈ Eij min( mi,e / Me , mj,e / Me )
where mi,e is the mention count of character i in episode e, Me is the total tracked mentions in e, and Eij is the set of episodes in which both i and j appear. The minimum operator ensures that a character who dominates a crowded episode does not inflate the weight of every pairwise tie in that episode; only the lesser partner's share counts. A two-hander where both characters split attention equally contributes more than an ensemble scene where one character briefly surfaces among dozens.
Community detection
Communities are identified by applying greedy modularity maximisation (Clauset, Newman, and Moore, 2004) to the weighted adjacency matrix. The algorithm is agglomerative: it starts with each node as its own community and iteratively merges the pair of communities whose merger yields the greatest increase in modularity, stopping when no merge improves the score. This produces five communities that correspond recognisably to narrative groupings: The Zone Squad (Slothrop and the Zone-associated figures), London Counterforce (Pointsman, Roger, Jessica, Pirate, and their milieu), The Rocket (Blicero, Gottfried, Enzian, the Schwarzkommando, and Tchitcherine's network), Peenemünde (Pökler, Mondaugen, Jamf, and the chemical-industrial complex), and Afterlives (the séance figures, Lyle Bland, and the departed). These labels are my own retrospective interpretation of what the algorithm surfaces; the clustering itself receives no narrative priors.
Layout
Node positions are pre-computed offline using a Fruchterman-Reingold force-directed layout (1991) initialised from a community-seeded arrangement: nodes belonging to the same community start in the same quadrant, which accelerates convergence and produces more legible cluster separation than random initialisation. The layout runs for 500 iterations with Barnes-Hut approximation (threshold 0.5) and exports fixed (x, y) coordinates.
At render time, the browser does not run a live simulation. D3's forceCollide applies a collision-avoidance pass (100 ticks, radius proportional to node size plus label padding) to nudge overlapping nodes apart without displacing the global topology. This ensures labels remain legible at all zoom levels without introducing the visual instability of a continuously animated layout.
Visual encoding
Node radius scales with weighted degree (the sum of all incident edge weights), square-rooted and linearly mapped to a display range of 3 to 12 SVG units. Labels are assigned to three visibility tiers based on weighted-degree rank: tier 1 (top 15) always visible, tier 2 (16 to 40) shown on community highlight or hover, tier 3 (remainder) shown only on direct hover. Edge stroke width scales linearly with weight.
1.2Matrix
Character selection
The matrix includes the 40 characters with the highest weighted degree. This threshold is a legibility constraint: at cell dimensions of 16 × 10.24 px, the resulting matrix occupies a viewport-width figure while keeping row and column labels readable at their rendered size. Characters outside the top 40 retain full representation in the atlas; their exclusion from the matrix is a visual limitation, not an analytical one.
Ordering
Characters are sorted by two keys: community membership (primary) and weighted degree within community (secondary, descending). This produces the block-diagonal structure visible along the main diagonal: clusters of strong within-community ties appear as dense coloured blocks, and cross-community connections scatter into the off-diagonal regions. The ordering is fixed rather than interactive; a seriation algorithm (e.g. optimal leaf ordering on a dendrogram) might reveal additional structure but would obscure the community labels that anchor interpretation.
Visual encoding
Only the lower triangle is rendered, since co-occurrence is symmetric. Cell opacity encodes edge weight on a linear scale mapped from the minimum displayed weight (opacity 0.15) to the maximum (0.95). Cells linking two characters within the same community take that community's assigned colour; cross-community cells use the page's neutral text colour (--color-text-dim). The diagonal carries no data cells but is marked with a thin rule to demarcate the matrix boundary. Community labels are positioned in the vacant upper triangle, rotated to run parallel with the diagonal, providing group identification without consuming additional vertical space.
Limitations
Co-mention at episode level is too coarse a unit to establish conversation, encounter, or relationship. Two characters who appear in the same 10,000-word episode may never interact within it. The matrix (and the atlas) should be read as a map of textual proximity rather than a social network in the strict sense: it captures where Pynchon distributes attention, not necessarily where characters engage with one another.