The pages are in English; this contents, the search and the buttons are in Japanese.
How it compares
Kyogijo Stadiums is one of several packages and sites that draw playing surfaces or the places they stand in. This page lays them side by side on facts that can be checked: what each draws, for how many sports and leagues, what it knows about parks and grounds, what it does with data, what it needs, and under which licence. It is not a ranking: the others are good at what they are for, several go further than Kyogijo in places (see below the table), and most are older.
How it was made: each project's README was read on 2026-10-13 through the GitHub API (gh api repos/<owner>/<name>/readme), with its manifest for the dependencies (requirements.txt, setup.py, pyproject.toml, DESCRIPTION) and GitHub's licence field and licence file for the licence. A dash (—) means the README does not describe it: that is not a claim that the project cannot. Only facts were taken, and no code or text of any of them is used here; references.md says what we may use of each. If a row is wrong or out of date, open an issue with the line of the README that says otherwise.
| Kyogijo Stadiums | sportypy | sportyR | @sportsdataverse/sporty | hockey_rink | mplsoccer | ggsoccer | GeomMLBStadiums | gavinr spring training | thestadi.com | |
|---|---|---|---|---|---|---|---|---|---|---|
| Written in, draws to | TypeScript; SVG text, a container, a custom element, a frame, a canvas, a d3 selection, an Observable Plot mark, GeoJSON, PNG | Python; Matplotlib | R; ggplot2 | TypeScript; SVG, canvas, Observable Plot, d3 | Python; Matplotlib | Python; Matplotlib | R; ggplot2 | R; ggplot2 | data: CSV (GeoJSON files too) | a website: an interactive map |
| Sports | football (NFL, CFL, IFAF), hockey, basketball, soccer, baseball and softball, curling, tennis, volleyball (indoor, beach and sitting), badminton, pickleball, table tennis, padel, squash, racquetball, sepak takraw, teqball, roundnet, netball, swimming, water polo, diving, artistic swimming, lacrosse (field and box), rugby (union and league), Australian football, Gaelic football and hurling, cricket, field hockey, handball | baseball, basketball, curling, football, hockey, soccer, tennis (its units table adds volleyball) | baseball, basketball, curling, football, hockey, lacrosse, soccer, softball, tennis, volleyball | basketball, hockey, football, soccer, baseball, tennis, volleyball, curling, lacrosse | hockey | soccer | soccer | baseball | baseball (spring training) | NFL, NBA, MLB, NHL and MLS venues |
| Rugby, Australian football, Gaelic games, cricket, field hockey, handball | each from its governing body's current rulebook, every figure cited: rugby union (World Rugby) and league (NRL, IRL), the AFL's oval with six named grounds, the GAA's field for football and hurling, a cricket ground with a boundary of your own and the 30-yard circle, the FIH's pitch and the IHF's court; scores in goals and behinds, goals and points, and a board of runs and wickets (see Field sports) | — | — | — | — | — | — | — | — | — |
| Swimming, water polo, diving, artistic swimming | each from World Aquatics' Competition Regulations (February 2026), every figure cited: the pool in 50 and 25 m of one to ten lanes with its ropes, floor markings, blocks, panels, flags and false start rope, a side section, the water polo field, the diving well at the distances of Appendix 2, the artistic swimming area; the lanes of a race with flags, medals, splits, reaction times and pace bars, a race replay and a natatorium (see Pools) | — | — | — | — | — | — | — | — | — |
| Leagues and rule sets | the sport's own (NFL, CFL, IFAF, NHL, NBA, MLB, World Curling, ITF, FIVB, BWF, USA Pickleball, ITTF, World Lacrosse, World Rugby, the AFL, the GAA, the ICC, the FIH, the IHF) and 48 league variants: WNBA, FIBA, the NCAA, the IIHF, the AHL, the NFHS, Little League, PONY, softball, the NRL, the PLL, the NLL and more | 44 leagues in its units table: FIBA, WNBA, NCAA, NFHS, IIHF, AHL, ECHL, MLS, ITF and more | 53 leagues in its units table | 53 league surfaces | — (the README lists none) | — | — | — | — | — |
| Ballparks, past ones included | 94 ballparks, each with its own fence: 30 current MLB, 44 past MLB (a season's fence for some), 12 NPB home parks, 8 other NPB grounds | — | — | — (a baseball field by league) | — | — | — | the 30 current MLB parks and a generic one, as outlines | the 23 Cactus and Grapefruit League parks, as points | the stadiums of five leagues, as points |
| Wall heights and quirks of a ballpark | 35 parks with the height of the wall by stretch and season (the Green Monster, the Crawford Boxes, the Baggie), drawn as bands whose width and shade say how high, with a key; Tal's Hill, the ivy and basket, overhangs, poles, bullpens, the backstop and the dugouts, each cited | — | — | — | — | — | — | — | — | — |
| Soccer grounds | 64 grounds, each pitch at its published size | — | — | — | — | — | — | — | — | the 30 MLS stadiums, as points |
| Special games: one surface set inside another | 18 games, to scale (the NHL's outdoor games in ballparks and football stadiums, a college basketball game on a carrier, MLB in London), each with its day, its venue and its sources; the rink's place is cited where a source gives it and marked as a convention where none does; the teams, the score and data layers are on the inner surface (see Special games) | — | — | — | — | — | — | — | — | — |
| Surfaces by season | yes: the NHL, NBA, NFL, CFL and baseball, each change cited | — | — | — | — | — | — | — | — | — |
| Units | 6 units: each surface in its rulebook's, converted either way | yes: each league's rulebook unit, and the data's | yes (a units option) | yes (units, the anchors converted too) | — | — | — | — | — | — |
| Data providers' coordinate frames | 48 frames: 10 soccer providers, the NHL API, HockeyTech, NBA stats, NFL tracking, MLBAM, Retrosheet, a curling stone's place from the button, the twelve net, racket and court sports' places from the net or the centre of the court and the seven field sports' places from the centre, the four pools' from the middle of the water, the athletics stadium's, the skating rink's and the six budō surfaces' from the middle of the track, the rink or the floor, and your own | — (it moves the origin and rotates) | — (the same) | 4 frames: nba-legacy, nba-legacy-vertical, hockeytech, espn-football-0-100 | — | 9 pitch types, and a standardiser between them | 4 built in (Opta, StatsBomb, Wyscout, Tracab), your own, and a rescale between them | MLBAM's hc_x and hc_y, with a transform | — | — |
| Data layers: points, lines, arrows, text | yes, as options, in a frame, with a table of the numbers for a screen reader | scatter and arrow methods | — (ggplot layers) | surfaces for Observable Plot and d3, which add the marks | wrappers for Matplotlib plotting methods | arrows, scatter and comet lines | passes and shots as ggplot layers | a spray-chart geom | — | — |
| Heat maps, hexbins, zones, contours | heatmap, hexbin, zones (fourteen sets for eighteen sports), contour and legends | heatmap and contour (a README example) | — | basketball shot zones | binned plots (an example notebook) | heatmaps and hexbins | — | — | — | — |
| Ready-made charts | 9: an NBA shot chart, an NHL shot map, an MLB spray chart, an NFL pass chart, a soccer shot map with a goal mouth, the stones of a curling end, a heat map of where curling stones stop, a pass network, and the road to a tournament's final (the two finalists' matches as round flags with the scores, in four sizes) | — | — | — (a shot-charts guide in the sibling sdvplot package's docs) | — | radar, pizza and bumpy charts | — | a spray chart on a stadium | — | — |
| Team shape: networks, formations, space | 8 layer kinds (see Team shape): pass network, formation, lineup, Voronoi, Delaunay, convex hull, flow field and sonar, with 36 named formations of 13 sports, each with a table for a screen reader | — | — | — | — | yes, in its docs gallery (not its README): pass network, pass flow, convex hull, Delaunay, Voronoi, formations and four sonar pages | — | — | — | — |
| Animation | yes: a replay of tracking data on any surface, with controls, a keyboard, steps for reduced motion and a live region (see Replay) | — | — | — | yes (an example notebook) | yes (its docs gallery) | — | — | — | — |
| Colours, looks and line styles | 7 named looks (light and dark, held to WCAG contrast by a test), a colour for each of 12 to 18 named features of a surface, line width, dash and opacity, goal styles for seven sports and a function of your own for the goals, 9 mowing patterns on football, baseball and soccer | colour updates per named feature, with a list of the feature names | — | — | — | stripes, z-order and padding as options | colour, fill, line width, line type and alpha; goal styles and a custom goal function | — | — | — |
| Direction, axes and labels | an arrow for the end each team attacks (by the sport's rule for the period), axes with ticks in the surface's numbers or any of its frames, and a name for each part of a surface, in English and Japanese, wide and tall | — | — | — | — | an axis and labels on a pitch | a direction label | — | — | — |
| Display ranges: zoom to a part of a surface | range: 114 named ranges across the thirty-nine surfaces (a rink's zones, a half, the paint, the red zone, the penalty area, the infield, a curling house) at either end, or a box in the drawing's feet, in units or in any frame; the data, the heat, the labels and a score follow the crop (see Display ranges) | display_range, "unique to each sport" (a README example: the NFL's red zone), and xlims and ylims | display_range (a README example: the red zone) | displayRange, xlim and ylim, and an error for an unknown range | — | — | — | — | — | — |
| Grids of drawings: small multiples with a title, a key and a credit line | drawGrid (see Layouts and backgrounds): any of the drawings and charts in one SVG, each with its own ids, title and description, a shared title, subtitle, key and credit line, in a size for a social card (1200 by 675), a square post (1080 by 1080) or a phone (390 wide), one SVG that every renderer reads | — | — | — | — | yes: grid (its source, mplsoccer/grid.py, says "a grid of axes with an endnote and title"; not its README) | — | — | — | — |
| Grounds behind a drawing | background: seven patterns drawn in SVG (felt, grass, wood, ice, paper, a grid, dots) in the drawing's ink, a colour, and a photograph at an opacity held to the rules of a logo's address, on a drawing or a grid | — | — | — | — | pitch_color (the README's first example: pitch_color='grass') and stripe | panel.background as a colour (README examples) | — | — | — |
| Score mode: the teams, their logos and the score on the surface | yes, wide or tall, and as a strip for a list | — (its README says logos may be shown in a future version) | — | — | — | — | — | — | — | — |
| Round team marks: a flag or a crest in a circle | yes: on a pitch, a rink or a court in score mode, in a badge, and in the road-to-the-final chart; a team with no picture is drawn as its initials on its colour | — | — | — | — | — | — | — | — | — |
| Languages of its words | English and Japanese | — | — | — | — | — | — | — | — | — |
| Renderers: one drawing on other targets | scene as plain data, canvas (a browser's or a Node canvas, no library imported), d3, Observable Plot, GeoJSON and PNG (see Renderers) | Matplotlib only | ggplot2 only | scene to SVG, canvas, Observable Plot and d3 subpaths | Matplotlib only | Matplotlib only | ggplot2 only | ggplot2 only | — | — |
| Runtime dependencies | none; one optional peer, @resvg/resvg-js, for PNG in Node only | matplotlib, numpy, pandas, scipy | ggplot2, ggfittext, glue, grid, rlang | none for the core; optional peers: @observablehq/plot, d3, @napi-rs/canvas | matplotlib, numpy, pillow | matplotlib, numpy, pandas, Pillow, requests, scipy, seaborn | ggplot2 | ggplot2, grid | — | — |
| Licence | MIT | GPL-3.0 | GPL (>= 3) | MIT (ported from sportyR and sportypy, by agreement of their maintainers) | GPL-3.0 | MIT | MIT + file LICENSE | MIT + file LICENSE | no licence file (the README invites use of the data) | — |
| A map of the places | an atlas: 163 places in 23 countries, by sport, league, country and year | — | — | — | — | — | — | — | yes (an ArcGIS map linked from the README) | yes: the whole site |
Where the others go further#
- More leagues. sportyR and sporty hold 53 league surfaces against Kyogijo's 67 rule sets, 48 of them variants. Kyogijo's are the ones it has a rulebook to cite for (see League variants).
- A wider toolbox. mplsoccer draws radar, pizza and bumpy charts and loads StatsBomb's open data; the sibling packages of
@sportsdataverse/sportydo team marks and tables. - The data tools beside them. The R and Python packages sit in the ecosystems where the data is analysed. Kyogijo takes the data you give it and reads no network.
- Age. ggsoccer's repository dates from 2017, mplsoccer's from 2019, sportyR's, sportypy's and hockey_rink's from 2021. Kyogijo has been on npm since October 2026 (first release 0.1.0).
Where Kyogijo goes further#
- More sports. Pickleball, badminton, table tennis, padel, squash, racquetball, sepak takraw, teqball, roundnet, netball, swimming, water polo, diving, artistic swimming, rugby (union and league), Australian football, Gaelic football and hurling, cricket, field hockey and handball, none of which any of the three lists; lacrosse, which sportyR and
@sportsdataverse/sportydraw too, is here from four governing bodies' rulebooks, the field and the box. - A surface is also a scoreboard. The teams' names and logos on their sides and the score in the middle, wide or tall, or as a strip for a list, in a drawing that says all of it to a screen reader.
- Places, not only surfaces. Ballparks of today and of the past, each with its own fence, soccer grounds at their published pitch sizes, each with its Wikidata item, and an atlas of them all.
- Time. A surface as the rules marked it in a season, each change cited.
- A surface inside another. An NHL rink on a ballpark's infield or a football stadium's field, a basketball court on a carrier's deck, a baseball field laid over a stadium's pitch: to scale, each with its sources, and marked as a convention where no source says where the surface stood.
- Looks and labels that hold. Seven named looks whose every line is tested for contrast in light and dark, and labels, axes and arrows that stay upright when a surface is turned.
- No dependencies and no runtime but the browser's. A drawing is a string from a pure function, the same in Node, an edge function and a page.
- Renderers to match, and two more. The drawing is plain data (a scene) that paints to a canvas, a d3 selection and an Observable Plot as
@sportsdataverse/sportydoes, and also to GeoJSON, in feet or a provider's frame, and to a PNG, with no dependency in the core and the one optional peer for the PNG (Renderers). - Small multiples and grounds in one picture. A grid of drawings or charts with a title, a key and a credit line, one SVG with a group title and a title for each drawing, in the size of a social card or a phone; and a pattern or a photograph behind any drawing or grid (Layouts and backgrounds).
- English and Japanese in the drawing's words, its statuses and the sentence for each change.
What each README says#
Each cell above is from the README or the manifest named here; where a README gives a count, the count is quoted.
- sportypy (Python, Matplotlib): surfaces for baseball, basketball, curling, football, hockey, soccer and tennis; a
display_rangethat zooms to a red zone or a house (the README's example is the NFL's red zone);x_trans,y_transandrotation; a table of the rulebook unit of 44 leagues (volleyball included);scatter,arrow,heatmapandcontourfon a surface; requirementsmatplotlib,numpy,pandas,scipy; GPL-3.0. - sportyR (R, ggplot2): the same for R, with lacrosse, softball and volleyball too (53 leagues in its units table);
DESCRIPTIONimports ggfittext, ggplot2, glue, grid and rlang; GPL (>= 3). - @sportsdataverse/sporty (TypeScript): a port of sportyR 2.2.3, nine sports and 53 league surfaces as a scene that draws to SVG, canvas, Observable Plot or d3;
toSurfaceFramewith four frames; basketball shot zones; units that convert the anchors too; no dependency for the core; MIT. The repository's other packages, sdvplot and sdvtables, do team marks (a mark picked by season) and tables. - hockey_rink (Python, Matplotlib): hockey rinks, with notebooks for drawing (a dark-theme rink included), plotting (wrappers for Matplotlib's methods, binned plots shown) and animating; requirements
matplotlib,numpy,pillow; GPL-3.0. - mplsoccer (Python, Matplotlib): "nine different pitch types", radar, Nightingale or pizza and bumpy charts (its docs gallery, read the same day, also has the pages Pass Network, Pass flow plot, Convex Hull, Plots Delaunay Tessellation of Players, Plots a Voronoi diagram, Formations and the sonars Sonar, Sonar Grid, Sonar Zones and Bin Statistic Sonar), arrows, heatmaps, hexbins, scatter and comet lines, a loader for StatsBomb's open data, a
gridof pitches with a title and an endnote (read inmplsoccer/grid.py, not the README), a standardiser of pitch coordinates; its docs gallery has an animation page; MIT. - ggsoccer (R, ggplot2): pitches as ggplot layers; Opta (the default), StatsBomb, Wyscout and Tracab out of the box, any custom specification,
rescale_coordinates, goal styles, a direction label, colour, fill, line width, line type and alpha, a custom goal function;DESCRIPTIONimports ggplot2; MIT + file LICENSE. - GeomMLBStadiums (R, ggplot2): “the 30 current MLB stadiums, in addition to a ‘generic’ stadium” as paths in MLBAM's
hc_xandhc_y, withmlbam_xy_transformationand a spray-chart geom; imports ggplot2 and grid; MIT + file LICENSE. - mlb-spring-training-stadiums (data): the Cactus League (10 parks) and Grapefruit League (13) as CSV (name, latitude, longitude, teams, address) and GeoJSON, "originally obtained from Wikipedia in March 2013", with an ArcGIS map; no licence file; "Everyone is welcome to contribute or use this data."
- thestadi.com (a website): "an interactive map showing all NFL, NBA, MLB, NHL, and MLS stadiums and arenas across North America" (32, 30, 30, 32 and 30 teams), with search, a filter by league, team logos and venue details.