How I turned World Cup data into posters | Zeh FernandesHow I turned World Cupdata into posters<br>The World Cup is a melting pot. It mixes geopolitics, underdogs, national identity, tactical obsession, and those brief moments of brilliance that make everyone watching feel the same thing at once. It has everything a good story needs, which is probably why it keeps pulling me back.<br>For the past four World Cups — 2018, 2019, 2022, and 2023 — I've been trying to turn match data into posters. Each edition became a different visual system, another attempt to challenge the conventions of infographics and make art with data. Something you feel and perceive before reading it.<br>For 2026 I wanted to do something different: make an organic, painting-like poster of two teams pushing against each other, blurring into the lines.<br>After it blew up on Twitter, I decided to write a breakdown of how these posters are made.<br>Tooling and data<br>Everything starts with the data. No poster exists without it. Before the brush strokes, before the color.<br>All the data comes from the official FIFA website¹. So I wrote a Node script that downloads the aggregate match stats and the event timeline: goals, fouls, cards, attempts.<br>¹ The data isn't exactly public-facing, but if you dig into the network tab of your browser you can find the endpoints they use.Generative art has this amazing quality where the final image looks spontaneous, but getting there usually involves a ridiculous amount of parameter tweaking. You move one number and ruin the whole thing. You move it back by 0.02 and suddenly it works again. So I built the interface below to iterate on the rules: on the left, the game data; on the right, the parameters controlling the composition.<br>The logic behind the poster<br>The backbone of the poster is a chrono-grid.<br>The full duration of the match is mapped onto a two-dimensional grid. The first cell is the kickoff. The last cell is the final whistle.<br>I landed on a fixed eight-column grid after trying a lot of different formats. Eight had the right balance. It gave me enough horizontal compression to make the two sides feel like they were facing each other.<br>The number of rows took even more trial and error. I started with something close to 200, which was completely unreasonable, and slowly tuned it down until I reached 11. That gave me roughly one minute per cell, which turned out to be a sweet spot.<br>The events<br>Once time is mapped into space, I can start placing events on top of it.<br>This year, I chose attempts as the central event in the composition. They felt like the clearest visual expression of attacking intent, a good proxy for pressure, ambition, and the constant effort to break through the opponent's defense. A match can have plenty of possession and still feel harmless.<br>On top of that, I also add fouls and goals. Goals are drawn larger and labeled with the minute they happened. Fouls are there too, smaller but still present. Each event is positioned in the grid according to the minute it happened.<br>The lines<br>Every event emits a set of brush strokes. Home team strokes begin at the event and flow to the left. Away team strokes flow to the right. That directional logic gives the image its sense of confrontation, like two forces constantly leaning into each other.<br>The length of each stroke is based on pass share — that team's passes divided by the total passes in the match. The team that circulated the ball more gets longer strokes. A team with less passing volume gets shorter, more abrupt marks.<br>The density of the lines is driven by possession. A team with less of the ball appears sparser, while a team with more possession occupies more of the space.<br>The gravity field<br>If I just end with the lines the posters would look a lot alike. And here is the nice touch to create more variation between the matches:<br>Goals are treated as gravity points inside a vector field. This is a classic flow-field idea: place attractive or repulsive forces in space, and let nearby lines bend in response.<br>In practice, that means the strokes around a goal start curving toward it. The more activity there is in a part of the match, the more the surrounding flow gets pulled and distorted. Goals reorganize the space around them.<br>The drama<br>The final component is what I called score drama: a way to calculate how intense the game was.<br>Late goals, especially those after the 75th minute, carry the most weight. A penalty shootout adds a big jump. Close games, chaotic endings, and high-scoring matches all increase the drama score.<br>That score controls how busy the composition becomes. More drama means more strokes, more movement, and a stronger tangential force around the goals. Instead of lines pointing directly toward the goal, they begin to swirl around it.<br>This turned out to be important for two reasons:<br>First, it gave more dramatic matches, especially knockout-stage ones, a distinct visual intensity.<br>Second, it prevented all the lines from collapsing into dense stains...