Awesome
<img alt="histogram" width="200" src="https://raw.githubusercontent.com/scikit-hep/hist/main/docs/_images/histlogo.png"/>Hist
Hist is an analyst-friendly front-end for boost-histogram, designed for Python 3.8+ (3.6-3.7 users get older versions). See what's new.
Installation
You can install this library from PyPI with pip:
python3 -m pip install "hist[plot,fit]"
If you do not need the plotting features, you can skip the [plot]
and/or
[fit]
extras. [fit]
is not currently supported in WebAssembly.
Features
Hist currently provides everything boost-histogram provides, and the following enhancements:
-
Hist augments axes with names:
name=
is a unique label describing each axis.label=
is an optional string that is used in plotting (defaults toname
if not provided).- Indexing, projection, and more support named axes.
- Experimental
NamedHist
is aHist
that disables most forms of positional access, forcing users to use only names.
-
The
Hist
class augmentsbh.Histogram
with simpler construction:flow=False
is a fast way to turn off flow for the axes on construction.- Storages can be given by string.
storage=
can be omitted, strings and storages can be positional.data=
can initialize a histogram with existing data.Hist.from_columns
can be used to initialize with a DataFrame or dict.- You can cast back and forth with boost-histogram (or any other extensions).
-
Hist support QuickConstruct, an import-free construction system that does not require extra imports:
- Use
Hist.new.<axis>().<axis>().<storage>()
. - Axes names can be full (
Regular
) or short (Reg
). - Histogram arguments (like
data=
) can go in the storage.
- Use
-
Extended Histogram features:
- Direct support for
.name
and.label
, like axes. .density()
computes the density as an array..profile(remove_ax)
can convert a ND COUNT histogram into a (N-1)D MEAN histogram..sort(axis)
supports sorting a histogram by a categorical axis. Optionally takes a function to sort by..fill_flattened(...)
will flatten and fill, including support for AwkwardArray..integrate(...)
, which takes the opposite arguments as.project
.
- Direct support for
-
Hist implements UHI+; an extension to the UHI (Unified Histogram Indexing) system designed for import-free interactivity:
- Uses
j
suffix to switch to data coordinates in access or slices. - Uses
j
suffix on slices to rebin. - Strings can be used directly to index into string category axes.
- Uses
-
Quick plotting routines encourage exploration:
.plot()
provides 1D and 2D plots (or useplot1d()
,plot2d()
).plot2d_full()
shows 1D projects around a 2D plot..plot_ratio(...)
make a ratio plot between the histogram and another histogram or callable..plot_pull(...)
performs a pull plot..plot_pie()
makes a pie plot..show()
provides a nice str printout using Histoprint.
-
Stacks: work with groups of histograms with identical axes
- Stacks can be created with
h.stack(axis)
, using index or name of an axis (StrCategory
axes ideal). - You can also create with
hist.stacks.Stack(h1, h2, ...)
, or usefrom_iter
orfrom_dict
. - You can index a stack, and set an entry with a matching histogram.
- Stacks support
.plot()
and.show()
, with names (plot labels default to original axes info). - Stacks pass through
.project
,*
,+
, and-
.
- Stacks can be created with
-
New modules
intervals
supports frequentist coverage intervals.
-
Notebook ready: Hist has gorgeous in-notebook representation.
- No dependencies required
Usage
from hist import Hist
# Quick construction, no other imports needed:
h = (
Hist.new.Reg(10, 0, 1, name="x", label="x-axis")
.Var(range(10), name="y", label="y-axis")
.Int64()
)
# Filling by names is allowed:
h.fill(y=[1, 4, 6], x=[3, 5, 2])
# Names can be used to manipulate the histogram:
h.project("x")
h[{"y": 0.5j + 3, "x": 5j}]
# You can access data coordinates or rebin with a `j` suffix:
h[0.3j:, ::2j] # x from .3 to the end, y is rebinned by 2
# Elegant plotting functions:
h.plot()
h.plot2d_full()
h.plot_pull(Callable)
Development
From a git checkout, either use nox, or run:
python -m pip install -e .[dev]
See Contributing guidelines for information on setting up a development environment.
Contributors
We would like to acknowledge the contributors that made this project possible (emoji key):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> <table> <tr> <td align="center"><a href="https://github.com/henryiii"><img src="https://avatars1.githubusercontent.com/u/4616906?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Henry Schreiner</b></sub></a><br /><a href="#maintenance-henryiii" title="Maintenance">🚧</a> <a href="https://github.com/scikit-hep/hist/commits?author=henryiii" title="Code">💻</a> <a href="https://github.com/scikit-hep/hist/commits?author=henryiii" title="Documentation">📖</a></td> <td align="center"><a href="http://lovelybuggies.com.cn/"><img src="https://avatars3.githubusercontent.com/u/29083689?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nino Lau</b></sub></a><br /><a href="#maintenance-LovelyBuggies" title="Maintenance">🚧</a> <a href="https://github.com/scikit-hep/hist/commits?author=LovelyBuggies" title="Code">💻</a> <a href="https://github.com/scikit-hep/hist/commits?author=LovelyBuggies" title="Documentation">📖</a></td> <td align="center"><a href="https://github.com/chrisburr"><img src="https://avatars3.githubusercontent.com/u/5220533?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Burr</b></sub></a><br /><a href="https://github.com/scikit-hep/hist/commits?author=chrisburr" title="Code">💻</a></td> <td align="center"><a href="https://github.com/aminnj"><img src="https://avatars.githubusercontent.com/u/5760027?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nick Amin</b></sub></a><br /><a href="https://github.com/scikit-hep/hist/commits?author=aminnj" title="Code">💻</a></td> <td align="center"><a href="http://cern.ch/eduardo.rodrigues"><img src="https://avatars.githubusercontent.com/u/5013581?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Eduardo Rodrigues</b></sub></a><br /><a href="https://github.com/scikit-hep/hist/commits?author=eduardo-rodrigues" title="Code">💻</a></td> <td align="center"><a href="http://andrzejnovak.github.io/"><img src="https://avatars.githubusercontent.com/u/13226500?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Andrzej Novak</b></sub></a><br /><a href="https://github.com/scikit-hep/hist/commits?author=andrzejnovak" title="Code">💻</a></td> <td align="center"><a href="http://www.matthewfeickert.com/"><img src="https://avatars.githubusercontent.com/u/5142394?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Feickert</b></sub></a><br /><a href="https://github.com/scikit-hep/hist/commits?author=matthewfeickert" title="Code">💻</a></td> </tr> <tr> <td align="center"><a href="http://theoryandpractice.org"><img src="https://avatars.githubusercontent.com/u/4458890?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kyle Cranmer</b></sub></a><br /><a href="https://github.com/scikit-hep/hist/commits?author=cranmer" title="Documentation">📖</a></td> <td align="center"><a href="http://dantrim.github.io"><img src="https://avatars.githubusercontent.com/u/7841565?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Antrim</b></sub></a><br /><a href="https://github.com/scikit-hep/hist/commits?author=dantrim" title="Code">💻</a></td> <td align="center"><a href="https://github.com/nsmith-"><img src="https://avatars.githubusercontent.com/u/6587412?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nicholas Smith</b></sub></a><br /><a href="https://github.com/scikit-hep/hist/commits?author=nsmith-" title="Code">💻</a></td> <td align="center"><a href="http://meliache.srht.site"><img src="https://avatars.githubusercontent.com/u/5121824?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Eliachevitch</b></sub></a><br /><a href="https://github.com/scikit-hep/hist/commits?author=meliache" title="Code">💻</a></td> <td align="center"><a href="https://github.com/jonas-eschle"><img src="https://avatars.githubusercontent.com/u/17454848?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonas Eschle</b></sub></a><br /><a href="https://github.com/scikit-hep/hist/commits?author=jonas-eschle" title="Documentation">📖</a></td> </tr> </table> <!-- markdownlint-restore --> <!-- prettier-ignore-end --> <!-- ALL-CONTRIBUTORS-LIST:END -->This project follows the all-contributors specification.
Talks
- 2021-07-07 PyHEP 2021 -- High-Performance Histogramming for HEP Analysis 🎥
- 2020-09-08 IRIS-HEP/GSOC -- Hist: histogramming for analysis powered by boost-histogram 🎥
- 2020-07-07 SciPy Proceedings 🎥
- 2020-07-17 PyHEP 2020 🎥
Acknowledgements
This library was primarily developed by Henry Schreiner and Nino Lau.
Support for this work was provided by the National Science Foundation cooperative agreement OAC-1836650 (IRIS-HEP) and OAC-1450377 (DIANA/HEP). Any opinions, findings, conclusions or recommendations expressed in this material are those of the authors and do not necessarily reflect the views of the National Science Foundation.