Skip to main content

Pure-Python port of the R funkyheatmap package — generate publication-ready dataframe heatmaps with funky rectangles, pies, bars and more.

Project description

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)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyfunkyheatmap-0.1.2.tar.gz (31.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyfunkyheatmap-0.1.2-py3-none-any.whl (31.3 kB view details)

Uploaded Python 3

File details

Details for the file pyfunkyheatmap-0.1.2.tar.gz.

File metadata

  • Download URL: pyfunkyheatmap-0.1.2.tar.gz
  • Upload date:
  • Size: 31.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.11

File hashes

Hashes for pyfunkyheatmap-0.1.2.tar.gz
Algorithm Hash digest
SHA256 d9cebfbd4bc18f27aa8b6e148c5a1839325f08d943a85c1fe8a41fbeee8f06a0
MD5 2bfe0f9020465ce99916bf15b603d600
BLAKE2b-256 d525006ff5bc76660b200161eeb0684c8d56dfc17922feecf6fb2c48fcb16218

See more details on using hashes here.

File details

Details for the file pyfunkyheatmap-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: pyfunkyheatmap-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 31.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.11

File hashes

Hashes for pyfunkyheatmap-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 135fb9e9a36b843406536004f22549cbfa8bb0b3b992980c306de5a7ea311584
MD5 ae09e22022e02376ed960b43585dd4b0
BLAKE2b-256 a308570e26900753b681345c0075c407dda6480d306ed635f620350b7560fc57

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page