Matplotlib styles for HEP
Project description
A set of helpers for matplotlib
to more easily produce plots typically
needed in HEP as well as style them in way that's compatible with current
collaboration requirements (ROOT-like plots for CMS, ATLAS, LHCb, ALICE).
Installation
pip install mplhep
Getting Started
Styling
import mplhep as hep
hep.set_style(hep.style.ROOT) # For now ROOT defaults to CMS
# Or choose one of the experiment styles
hep.set_style(hep.style.CMS)
# or
hep.set_style("ATLAS") # string aliases work too
# or
hep.set_style("LHCb2") # or "LHCb1"
# or
hep.set_style("ALICE")
The style can be set directly from the matplotlib
API as well
import matplotlib.pyplot as plt
import mplhep as hep
plt.style.use(hep.style.ROOT)
Experiment specific style are also available. If the default styles are not what you need, I'd be happy to merge in new styles or modify the current ones.
Default experiment labels are also available.
# Overall - both left and right annotation
hep.<experiment>.label()
# Just experiment label and <text> such as 'Preliminary' or 'Simulation'
hep.<experiment>.text(<text>)
Plotting
1D Histograms
h, bins = [2, 3, 2], [0, 1, 2, 3]
hep.histplot(h, bins)
2D Histograms
import numpy as np
xbins, ybins = [0, 1, 2, 3], [0, 1, 2, 3]
H = np.array([[2,3,2], [1,2,1], [3,1,3]])
hep.hist2dplot(H, xbins, ybins)
More Information
Other styles:
hep.set_style("fira")
- use Fira Sanshep.set_style("firamath")
- use Fira Math
Styles can be chained:
- e.g.
hep.set_style(["CMS", "fira", "firamath"])
- reappearing
rcParams
get overwritten silently
Styles can be modified on the fly
- Since styles are dictionaries and they can be chained/overwritten they can be easily modified on the fly. e.g.
hep.set_style("CMS")
hep.set_style({"font.sans-serif":'Comic Sans MS'})
Styling with LaTeX
hep.set_style("CMSTex")
- Use LaTeX to produce all text labels- Requires having the full tex-live distro
- True Helvetica
- Use sansmath as the math font
- Takes longer and not always better
- In general more possibilities, but a bit more difficult to get everything working properly
Notes
Consistency & Fonts
As it is ROOT does not come with any fonts and therefore relies on using system fonts. Therfore the font in a figure can be dependent on whether it was produced on OSX or PC. The default sans-serif font used is Helvetica, but it only comes with OSX, in Windows this will silently fallback to Arial.
License
Both Helvetica and Arial are proprietary, which as far as fonts go means you can use it to create any text/graphics once you have the license, but you cannot redistribute the font files as part of other software. That means we cannot just package Helvetica with this to make sure everyone has the same font in plots.
Luckily for fonts it seems only the software is copyrighted, not the actual shapes, which means there are quite a few open alternatives with similar look. The most closely resembling Helvetica being Tex Gyre Heros
Tex Gyre Heros
http://www.gust.org.pl/projects/e-foundry/tex-gyre/heros
You can compare yourself if the differences are meanigful below.
They are Tex Gyre Heros, Helvetica and Arial respecively.
Math Fonts
- Math fonts are a separate set from regular fonts due to the amount of special characters
- It's not trivial to make sure you get a matching math font to your regular font
- Most math-fonts are serif fonts, but this is not ideal if one wants to use sans-serif font for normal text like Helvetica or Arial
- The number of sans-serif math-fonts is very limited
- The number of open sans-serif math-fonts is extremely limited
- Basically there's two, Fira Sans and GFS Neohellenic Math, of which I like Fira Sans better
- https://tex.stackexchange.com/questions/374250/are-there-opentype-sans-math-fonts-under-development
For consistent styling Fira Sans is included as well.
Default Fira Sans
https://github.com/mozilla/Fira
Math font extension
https://github.com/firamath/firamath
What doesn't work
Context styles and fonts
with pyplot.style.context(style.ROOT):
plotting...
- This syntax would be ideal, however, it doesn't work properly for fonts and there are no plans by mpl devs to fix this behaviour https://github.com/matplotlib/matplotlib/issues/11673
For now one has to set the style globally:
Use in publications
Updating list of citations and use cases of mplhep
in publications:
- Simultaneous Jet Energy and Mass Calibrations with Neural Networks, ATLAS Collaboration, 2019
- Integration and Performance of New Technologies in the CMS Simulation, Kevin Pedro, 2020 (Fig 3,4)
- GeantV: Results from the prototype of concurrent vector particle transport simulation in HEP, Amadio et al, 2020 (Fig 25,26)
- Search for the standard model Higgs boson decaying to charm quarks, CMS Collaboration, 2019 (Fig 1)
- Search for long-lived particles decaying to eμν, LHCb Collaboration, 2020
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
File details
Details for the file mplhep-0.2.12.tar.gz
.
File metadata
- Download URL: mplhep-0.2.12.tar.gz
- Upload date:
- Size: 5.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.2 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.8.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 16a9f35f93b1f3f7195cd64df7b233d7f29e5bb4dc2720316d42310607bcdba9 |
|
MD5 | 9b4764db274ee9278b38f41db33b7b04 |
|
BLAKE2b-256 | 1b58c95b5845e3724966a68397b39bc27744d84493463e3eb6e9bbda6c83d722 |
File details
Details for the file mplhep-0.2.12-py3-none-any.whl
.
File metadata
- Download URL: mplhep-0.2.12-py3-none-any.whl
- Upload date:
- Size: 5.4 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.2 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.8.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8761a117c915b98715db8f16bd5993c311ea6dfabf2d2d1efd576271ce4907f6 |
|
MD5 | 21d976cb587f8a389b25c4c87e7c2521 |
|
BLAKE2b-256 | 26ed7630678155ea92e97eb786f90dcee74af4ef00898ca84ce922ea3a53e459 |