py-funkyheatmap
Pure-Python port of the R package funkyheatmap, built under the omicverse-rebuildr reference-driven porting protocol.
Generate publication-ready, dynbenchmark-style data-frame heatmaps with
funky rectangles, circles, bars, pies, and text — directly from
pandas.DataFrame inputs, rendered with matplotlib, no R / ggplot
dependency.
| Upstream | funkyheatmap 0.5.2 (R, MIT) |
| Algorithm class | Visualisation / layout — adapted Class 1 (deterministic geometry) |
| Parity gate | max|Δ| over funkyrect_data / circle_data ≤ 1e-6 on canonical fixture |
| Achieved parity | max|Δ| = 0.0 on xmin / xmax / ymin / ymax / corner_size / color_value |
| License | MIT (matches upstream) |
Install
pip install -e . # editable, from this directory
pyfunkyheatmap needs only numpy, pandas, matplotlib — no R, no
rpy2, no system-level dependencies.
Quick start
import pandas as pd
from pyfunkyheatmap import funky_heatmap
df = pd.DataFrame({
"id": ["A", "B", "C", "D"],
"x": [0.10, 0.55, 0.80, 0.95],
"y": [0.50, 0.25, 0.75, 0.60],
"tag": ["alpha", "beta", "gamma", "delta"],
})
fh = funky_heatmap(df)
fh.save("out.png", dpi=150, bbox_inches="tight")
See:
examples/tutorial.ipynb— five-example tour (default heatmap → custom column info → pies → multi-group dynbenchmark layout → R⇄Python parity diff).examples/scIB.ipynb— Python equivalent of the RscIBvignette. Same fixture, samecolumn_info, same legends.examples/dynbenchmark.ipynb— Python equivalent of the Rdynbenchmarkvignette. Reproduces the Saelens et al. (2019) figure off the bundleddynbenchmark_dataobject.
All three notebooks ship pre-executed so GitHub renders them inline.
Public API
funky_heatmap(data, column_info, row_info, column_groups, row_groups, palettes, legends, position_args, scale_column, add_abc, *, fig=None, ax=None, fig_scale=0.25, dpi=100)
Mirrors the R funky_heatmap signature. Returns a FunkyHeatmap object with:
fh.figure— the matplotlibFigurefh.geom_positions— dict of per-glyph DataFrames (row_pos,column_pos,rect_data,circle_data,funkyrect_data,pie_data,img_data,text_data,segment_data)fh.bounds,fh.width,fh.height— layout extentsfh.save(path, **kwargs)— convenience wrapper aroundFigure.savefig
Side-API: verify_data, verify_column_info, verify_row_info,
verify_column_groups, verify_row_groups, verify_palettes,
verify_legends, scale_minmax, position_arguments. Each matches its
R counterpart.
Refactoring notes
The port is not a literal R-to-Python transliteration:
- One dataclass for layout knobs.
position_arguments(...)returns a typed dataclass that supportspa.row_heightandpa["row_height"]— both styles work, so R-style mapping access and Python attribute access stay open. - Geometry tables are first-class. The R package builds them internally and emits ggplot layers; we keep them on the result so downstream code (e.g. custom annotations, alternative renderers) can subclass without forking.
- No
cowplot/patchwork/ggforce. Rounded rectangles are drawn from a hand-rolled cubic-Bézier path; pies usematplotlib.patches.Wedge; layout is bare matplotlib. - Default-palette parity. The
RColorBrewercolour stops for theBlues / Reds / YlOrBr / Greens / GreysandSet1 / Set2 / Set3 / Dark2palettes are copied verbatim and interpolated with the same linear RGB ramp thatcolorRampPaletteuses, sopalettes="Blues"produces the same hex strings as in R.
Parity gate
$ Rscript tests/r_reference_driver.R data # produces data/r_basic_*.csv + data/r_basic.png
$ pytest tests/ # 8 / 8 pass
$ python examples/build_tutorial.py # rebuilds and re-executes the notebook
The pre-registered gate is max|Δ| over the funkyrect / circle geometry
columns on the canonical fixture (tests/r_reference_driver.R).
Achieved: max|Δ| = 0.0 — every coordinate matches R bit-for-bit.
See RECONSTRUCTION_REPORT.md for the full
audit trail.
Layout
pyfunkyheatmap/
├── __init__.py public surface
├── api.py funky_heatmap entry point
├── verify.py verify_* validators (one per R counterpart)
├── position.py PositionArguments dataclass
├── positions.py calculate_geom_positions + row/column layout
├── scale.py scale_minmax
├── palettes.py DEFAULT_PALETTES + brewer_pal + smear
└── figure.py compose_figure + FunkyHeatmap + matplotlib draw
examples/
├── build_tutorial.py nbformat script that builds + executes tutorial.ipynb
└── tutorial.ipynb pre-executed tutorial (5 examples + R parity diff)
tests/
├── r_reference_driver.R Rscript that produces data/r_basic_*.csv
└── test_basic.py pytest, 8 tests
funkyheatmap-ref/ upstream R source vendored for reference
data/ canonical fixture (R + Python outputs)
Metadata
Release files for pyfunkyheatmap 0.1.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pyfunkyheatmap-0.1.8.tar.gz | 32.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyfunkyheatmap-0.1.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 64.8 kB
Release files / pyfunkyheatmap-0.1.8.tar.gz
| Download URL | pyfunkyheatmap-0.1.8.tar.gz |
|---|---|
| Size | 32.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
73ca2fad6a173820389621844f7fc5a9b30b3e2dc4a3a8397289f71e60152a33
|
|
BLAKE2b-256 checksum How to use checksums |
b2a71d665eecf9d10dc8f316e3979d20b127a7e15557dd3b8bfb08fa06a23706
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.20
|
Release files / pyfunkyheatmap-0.1.8-py3-none-any.whl
| Download URL | pyfunkyheatmap-0.1.8-py3-none-any.whl |
|---|---|
| Size | 32.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
02ce171c3e06972de233a20cc62747af97c0c317541b8a9f7330653ad3e9eb54
|
|
BLAKE2b-256 checksum How to use checksums |
124644f77131c3abae08098a2d04e0191bac1a5b6bbb1a00c07cdcc50d52b288
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.20
|
Security for pyfunkyheatmap 0.1.8
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.