No project description provided
Project description
mplhockey is a Python library for plotting hockey rink charts in Matplotlib.
It provides accurate, publication-ready rink geometries across multiple leagues, with flexible unit handling, rotation, and zone-based rendering. The library is intentionally lightweight and designed to integrate cleanly into standard Matplotlib workflows.
Installation
Use the package manager pip to install mplhockey.
pip install mplhockey
Alternatively, you can install it in development mode directly from GitHub:
git clone https://github.com/mlsedigital/mplhockey.git
cd mplhockey
git checkout develop && git pull
pip install -e .
If you are using uv, you can add it directly to your project:
uv add mplhockey
Quick start
Create and draw a standard NHL rink:
from mplhockey import NHLRink
rink = NHLRink()
rink.draw()
All rinks expose the units they are currently parameterized in:
rink.units
You can control the units directly when constructing the rink:
rink = NHLRink(units="m")
rink.draw()
Or override the units at draw time:
rink.draw(units="mm")
Other Themes
By default we show the light theme, but there is also a dark theme for each rink which is accessible on the constructor.
from mplhockey import NHLRink
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
rink = NHLRink(theme="dark")
rink.draw(ax=ax)
ax.set_axis_off()
# Make EVERYTHING dark
ax.set_facecolor("#202020")
fig.patch.set_facecolor("#202020")
plt.show()
Custom Themes
Default schemes are housed in a schemes.yaml file which lays out colours each of the elements. Optionally, when the rink object is instantiated, you can pass in a dictionary that explictly defines those items. For example:
from mplhockey import KHLRink
my_theme = {
"ice": "#F4F8FB", # very light icy white-blue
"outline": "#8A9199", # cool neutral gray (softer than pure gray)
"red": "#C83E3E", # slightly muted hockey red (less neon)
"blue": "#2C6FB7", # deep rink blue (good contrast on ice)
"crease": "#A6D6E0", # soft cyan / goalie-crease blue
"net": "#EDEDED", # off-white (avoids pure white glare)
"penalty_box": "#E6E6E6", # subtle light gray
"bench": "#DADADA", # slightly darker than penalty box
}
rink = KHLRink(
theme = my_theme,
units = 'm',
)
rink.draw()
Will produce something like:
Rotation and display ranges
Rinks can be rotated by passing a rotation argument (in degrees) either to the constructor or the draw method.
You can also render only a subset of the rink, such as a single zone:
from mplhockey import NHLRink
rink = NHLRink()
rink.draw(rotation=90, display_range="ozone")
This is particularly useful for producing attacking-direction–consistent visualizations or focused zone-level analyses.
The default themes are great for showing animations of a hockey game or showing event locations from other data providers. However, for heatgrids they tend not to show up too well, so we've included two other themes over-dark and over-light which make the colour of the rink-markings uniform.
Coordinate system
All rinks in mplhockey are defined in a right-handed Cartesian coordinate system centered at center ice:
- The origin
(0, 0)is at center ice - The x-axis runs along the length of the rink
- The y-axis runs across the width of the rink
This coordinate system makes it straightforward to overlay spatial data such as shot locations, tracking data, or model outputs, while preserving geometric correctness across leagues and unit systems.
Customization and Matplotlib integration
Rinks are rendered as standard Matplotlib artists. This means:
- You can freely overlay scatter plots, lines, contours, or heatmaps
- Axis limits, aspect ratios, and styling behave exactly as expected
- Figures can be exported to PNG, SVG, PDF, or any Matplotlib-supported format
The goal is to provide a clean geometric foundation without constraining downstream visualization choices.
Supported rinks
mplhockey currently supports the following rink types:
NHLRink(National Hockey League Rink)NCAARink(National Collegiate Athletic Association Rink)IIHFRink(International Ice Hockey Federation Rink)KHLRink(Kontinental Hockey League Rink)PWHLRink(Standard PWHL Rink; same as NHL Rink)NRLRink(Standard Ringette Rink)
All rink classes accept an optional units argument, allowing them to be reparameterized consistently in different unit systems.
The design is intentionally extensible, making it straightforward to add new leagues, historical dimensions, or custom surfaces.
Design philosophy
mplhockey is deliberately focused on geometry and rendering only.
It does not:
- Fetch or manage hockey data
- Impose a data model for events or players
- Replace general-purpose plotting libraries
Instead, it aims to be a robust, composable building block for analysis, research, and visualization pipelines.
Users familiar with mplsoccer should find the mental model immediately familiar, adapted to the conventions and geometry of hockey.
License
mplhockey is released under the MIT License.
You are free to use, modify, and redistribute this software for both commercial and non-commercial purposes. See the LICENSE file for full details.
Acknowledgements
mplhockey is inspired by the design philosophy and success of mplsoccer and mplbasketball, adapting similar ideas to the unique geometric and visualization needs of hockey.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mplhockey-1.0.1.tar.gz.
File metadata
- Download URL: mplhockey-1.0.1.tar.gz
- Upload date:
- Size: 4.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e28730ff6439689862611ce9b78e172d772afab9e10f63eeeda8b5c99ac66a52
|
|
| MD5 |
5ed139d39d422592c4814cedb25a2766
|
|
| BLAKE2b-256 |
b961409126d80dfac7fae8478fe73a96cda58fff50ad5f1444e0e163ff6e99cc
|
Provenance
The following attestation bundles were made for mplhockey-1.0.1.tar.gz:
Publisher:
publish-pypi.yml on mlsedigital/mplhockey
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mplhockey-1.0.1.tar.gz -
Subject digest:
e28730ff6439689862611ce9b78e172d772afab9e10f63eeeda8b5c99ac66a52 - Sigstore transparency entry: 1291576935
- Sigstore integration time:
-
Permalink:
mlsedigital/mplhockey@7f34212944d43dc669eb86e5467dc610872fa482 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/mlsedigital
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@7f34212944d43dc669eb86e5467dc610872fa482 -
Trigger Event:
release
-
Statement type:
File details
Details for the file mplhockey-1.0.1-py3-none-any.whl.
File metadata
- Download URL: mplhockey-1.0.1-py3-none-any.whl
- Upload date:
- Size: 39.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5115b0d2c8b422690909eb156992535448431777be8b45ac618c608bf69c0a58
|
|
| MD5 |
5656d40f8d8745023f7bc6d4f011ffe5
|
|
| BLAKE2b-256 |
555d4d3c34639396866128eea4d89006ab1845d93ff6fac85f487e2d018d99f8
|
Provenance
The following attestation bundles were made for mplhockey-1.0.1-py3-none-any.whl:
Publisher:
publish-pypi.yml on mlsedigital/mplhockey
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mplhockey-1.0.1-py3-none-any.whl -
Subject digest:
5115b0d2c8b422690909eb156992535448431777be8b45ac618c608bf69c0a58 - Sigstore transparency entry: 1291577008
- Sigstore integration time:
-
Permalink:
mlsedigital/mplhockey@7f34212944d43dc669eb86e5467dc610872fa482 -
Branch / Tag:
refs/tags/v1.0.1 - Owner: https://github.com/mlsedigital
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@7f34212944d43dc669eb86e5467dc610872fa482 -
Trigger Event:
release
-
Statement type: