Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/janpipek/physt
Python histogram library - histograms as updateable, fully semantic objects with visualization tools. [P]ython [HYST]ograms.
https://github.com/janpipek/physt
2d-histograms heatmap histogram plotting python visualization
Last synced: 4 months ago
JSON representation
Python histogram library - histograms as updateable, fully semantic objects with visualization tools. [P]ython [HYST]ograms.
- Host: GitHub
- URL: https://github.com/janpipek/physt
- Owner: janpipek
- License: mit
- Created: 2016-03-25T13:41:56.000Z (almost 9 years ago)
- Default Branch: dev
- Last Pushed: 2024-03-25T12:57:23.000Z (11 months ago)
- Last Synced: 2024-04-29T10:35:01.919Z (10 months ago)
- Topics: 2d-histograms, heatmap, histogram, plotting, python, visualization
- Language: Python
- Homepage:
- Size: 22.1 MB
- Stars: 126
- Watchers: 10
- Forks: 15
- Open Issues: 37
-
Metadata Files:
- Readme: README.md
- Changelog: HISTORY.txt
- License: LICENSE
Awesome Lists containing this project
- fintech-awesome-libraries - physt - Improved histograms. (Data Visualization / General Purposes)
README
# physt 
P(i/y)thon h(i/y)stograms. Inspired (and based on) numpy.histogram, but designed for humans(TM) on steroids(TM).
Create rich histogram objects from **numpy** or **dask** arrays, from **pandas** and **polars** series/dataframes,
from **xarray** datasets and a few more types of objects. Manipulate them with ease, plot them with **matplotlib**,
**vega** or **plotly**.In short, whatever you want to do with histograms, **physt** aims to be on your side.
[](http://physt.readthedocs.io/en/latest/)
[](https://gitter.im/physt/physt)
[](https://pypi.org/project/physt/)
[](https://badge.fury.io/py/physt)
[](https://anaconda.org/janpipek/physt)
[](https://anaconda.org/janpipek/physt)
[](https://github.com/psf/black)## Simple example
```python
from physt import h1# Create the sample
heights = [160, 155, 156, 198, 177, 168, 191, 183, 184, 179, 178, 172, 173, 175,
172, 177, 176, 175, 174, 173, 174, 175, 177, 169, 168, 164, 175, 188,
178, 174, 173, 181, 185, 166, 162, 163, 171, 165, 180, 189, 166, 163,
172, 173, 174, 183, 184, 161, 162, 168, 169, 174, 176, 170, 169, 165]hist = h1(heights, 10) # <--- get the histogram data
hist << 190 # <--- add a forgotten value
hist.plot() # <--- and plot it
```
## 2D example
```python
from physt import h2
import seaborn as snsiris = sns.load_dataset('iris')
iris_hist = h2(iris["sepal_length"], iris["sepal_width"], "pretty", bin_count=[12, 7], name="Iris")
iris_hist.plot(show_zero=False, cmap="gray_r", show_values=True);
```
## 3D directional example
```python
import numpy as np
from physt import special_histograms# Generate some sample data
data = np.empty((1000, 3))
data[:,0] = np.random.normal(0, 1, 1000)
data[:,1] = np.random.normal(0, 1.3, 1000)
data[:,2] = np.random.normal(1, .6, 1000)# Get histogram data (in spherical coordinates)
h = special_histograms.spherical(data)# And plot its projection on a globe
h.projection("theta", "phi").plot.globe_map(density=True, figsize=(7, 7), cmap="rainbow")
```
See more in docstring's and notebooks:
- Basic tutorial:
- Binning:
- 2D histograms:
- Special histograms (polar, spherical, cylindrical - *beta*):
- Adaptive histograms:
- Use dask for large (not "big") data - *alpha*:
- Geographical bins . *alpha*:
- Plotting with vega backend:
...and others, see the `doc` directory.## Installation
Using pip:
`pip install physt`
or conda:
`conda install -c janpipek physt`
## Features
### Implemented
* 1D histograms
* 2D histograms
* ND histograms
* Some special histograms
- 2D polar coordinates (with plotting)
- 3D spherical / cylindrical coordinates (beta)
* Adaptive rebinning for on-line filling of unknown data (beta)
* Non-consecutive bins
* Memory-effective histogramming of dask arrays (beta)
* Understands any numpy-array-like object
* Keep underflow / overflow / missed bins
* Basic numeric operations (* / + -)
* Items / slice selection (including mask arrays)
* Add new values (fill, fill_n)
* Cumulative values, densities
* Simple statistics for original data (mean, std, sem) - only for 1D histograms
* Plotting with several backends
- matplotlib (static plots with many options)
- vega (interactive plots, beta, help wanted!)
- folium (experimental for geo-data)
- plotly (very basic, help wanted!)
- ascii (experimental)
* Algorithms for optimized binning
- pretty (nice rounded bin edges)
- mathematical (statistical, quantile-based, geometrical, ...)
* IO, conversions
- I/O JSON
- I/O xarray.DataSet (experimental)
- O ROOT file (experimental)
- O pandas.DataFrame (basic)### Planned
* Rebinning
- using reference to original data?
- merging bins
* Statistics (based on original data)?
* Stacked histograms (with names)
* Potentially holoviews plotting backend (instead of the discontinued bokeh one)### Not planned
* Kernel density estimates - use your favourite statistics package (like `seaborn`)
* Rebinning using interpolation - it should be trivial to use `rebin` () with phystRationale (for both): physt is dumb, but precise.
## Dependencies
- Python 3.8+
- Numpy 1.20+
- (optional) polars (0.20, 1.0), pandas, dask, xarray - if you want to histogram those
- (optional) matplotlib - simple output
- (optional) xarray - I/O
- (optional) uproot - I/O
- (optional) astropy - additional binning algorithms
- (optional) folium - map plotting
- (optional) vega3 - for vega in-line in IPython notebook (note that to generate vega JSON, this is not necessary)
- (optional) xtermcolor - for ASCII color maps
- (testing) pytest
- (docs) sphinx, sphinx_rtd_theme, ipython## Publicity
Talk at PyData Berlin 2018:
- - repository with slides and links
- - video of the talk## Contribution
I am looking for anyone interested in using / developing physt. You can contribute by reporting errors, implementing missing features and suggest new one.
Thanks to:
- **Ryan Mackenzie White** - for the protobuf idea and first implementationPatches:
- **Matthieu Marinangeli** -## Alternatives and inspirations
* (C++, part of boost)
* (Python wrapper around boost-histogram)
*