Skip to main content

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:

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 matplotlib Figure
  • fh.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 extents
  • fh.save(path, **kwargs) — convenience wrapper around Figure.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:

  1. One dataclass for layout knobs. position_arguments(...) returns a typed dataclass that supports pa.row_height and pa["row_height"] — both styles work, so R-style mapping access and Python attribute access stay open.
  2. 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.
  3. No cowplot / patchwork / ggforce. Rounded rectangles are drawn from a hand-rolled cubic-Bézier path; pies use matplotlib.patches.Wedge; layout is bare matplotlib.
  4. Default-palette parity. The RColorBrewer colour stops for the Blues / Reds / YlOrBr / Greens / Greys and Set1 / Set2 / Set3 / Dark2 palettes are copied verbatim and interpolated with the same linear RGB ramp that colorRampPalette uses, so palettes="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)

Source distribution for pyfunkyheatmap 0.1.8
File Size Uploaded Provenance
pyfunkyheatmap-0.1.8.tar.gz 32.3 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for pyfunkyheatmap 0.1.8
File Interpreter ABI Platform
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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page