A fluent, chainable wrapper around matplotlib for building modern, publication-ready plots with less boilerplate.
Project description
quickploteasy
A fluent, chainable wrapper around matplotlib for building better-looking plots and histograms with less boilerplate.
pip install quickploteasy
quickploteasy aims for charts that look like a senior analyst made them —
minimalist, decluttered, and finished by default. It ships the modern
Inter typeface, wraps every plot in an editorial
headline / subtitle / source frame, and styles the marks themselves:
bars get rounded tops and bold value labels (and drop the redundant y-axis when
every bar is labelled), one bar or series can carry the accent while the rest
recede to gray, line/area charts are directly labelled at their end instead
of via a legend, box plots come filled with a colourblind-checked palette, and
area charts fade out with a gradient. The palette and chrome are the validated
reference instance from a data-viz design method, stepped separately for light
and dark surfaces.
Instead of juggling fig, ax = plt.subplots(), styling calls, and label
setters, you describe a plot as a single readable chain:
import quickploteasy as qp
(qp.plot()
.bar(regions, sales, highlight="max") # gray context, accent on the peak
.labels(
title="The West region led the quarter",
subtitle="Net sales by region ($M)",
source="Source: internal figures",
)
.save("sales.png"))
Install (development)
This project uses a src/ layout and pyproject.toml. With
uv:
uv sync --extra dev # create a venv and install deps + dev tools
uv run pytest # run the test suite
uv run ruff check . # lint
API at a glance
Start a chain with qp.plot(data). data can be an array-like, a dict, or a
pandas DataFrame (reference columns by name).
Conventional forms
| Method | Description |
|---|---|
.hist(data=None, bins="auto", kde=False) |
Histogram; kde=True overlays a smooth density curve |
.line(x=None, y=None, fill=False) |
Line plot; fill=True adds a gradient area |
.area(x=None, y=None) |
Line with a gradient area fill (shorthand for line(fill=True)) |
.scatter(x, y) |
Scatter plot |
.bar(x, y, values=True, highlight=None) |
Bar chart; highlight takes an index / "max" / "min" to accent one bar |
.box(data=None, group_labels=None) |
Filled box plot with readable group labels |
Modern forms (the reason to reach for quickploteasy)
| Method | Description |
|---|---|
.lollipop(x, y, highlight=None) |
A lighter bar chart — stem + dot, great for many categories |
.ridgeline(groups, labels=None) |
Overlapping density "mountains" to compare a distribution across groups |
.raincloud(data, group_labels=None) |
Half-violin + jittered raw points + slim box — the modern box-plot replacement |
Overlaying multiple series (e.g. two .hist() calls) automatically advances
through the palette so each series gets a distinct hue. A labelled line/area
series is labelled directly at its end point; other labelled marks get a legend.
Text & styling
.title(text) (headline), .subtitle(text), .source(text) (footnote),
.xlabel(text), .ylabel(text),
.labels(title=, subtitle=, x=, y=, source=), .xlim(lo, hi), .ylim(lo, hi),
.grid(bool), .legend(), .theme(name)
Finishing
.save(path), .show(), .render() (returns the underlying (fig, ax) for
escape-hatch customization), .close()
Themes
Built-in themes: light (default), dark, minimal. Each theme bundles a
categorical palette (colourblind-checked, stepped for its surface) with chrome
roles — surface, primary/secondary ink, hairline grid, soft baseline. Themes
are applied locally per-figure via rc_context, so they never mutate your
global matplotlib state. List them with qp.themes().
qp.plot(data, theme="dark") # set at construction (preferred)
qp.plot(data).hist().theme("dark") # or switch in the chain
Status
Early alpha (0.1.0). The fluent core is in place; more chart types, faceting,
and a pandas-first convenience layer are on the roadmap.
License
quickploteasy is released under the MIT License. It bundles the
Inter typeface, which is licensed separately under the
SIL Open Font License 1.1 (see
Inter-LICENSE.txt).
Publishing
Packaging and release instructions live in PUBLISHING.md.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file quickploteasy-0.1.0.tar.gz.
File metadata
- Download URL: quickploteasy-0.1.0.tar.gz
- Upload date:
- Size: 682.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
821f42ae28bb4bf5c462bcafa84d8395ec9c48b380432f10c6939894120563af
|
|
| MD5 |
8e686b5ba10ea4fbe6b93e0d791a1261
|
|
| BLAKE2b-256 |
ebffa92c7619e2204319a66ad16f9e3a59d1d293a43613f68122f0151b84851b
|
File details
Details for the file quickploteasy-0.1.0-py3-none-any.whl.
File metadata
- Download URL: quickploteasy-0.1.0-py3-none-any.whl
- Upload date:
- Size: 682.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
408f68e96f96bae9e4ffd222957bbbf9c28365f81f9c355d6f2da52b3dfeae5d
|
|
| MD5 |
4b3ce053adc52fd3e9455b1ec13690f9
|
|
| BLAKE2b-256 |
eb42fada760e0e07554451a4728b99349aa91ad49d16f826af0d049fe5810c71
|