Skip to main content

BANNER

plotEZ

Mundane plotting made easy.

GitHub Release PyPI - Python Version GitHub-licence GiHub-CodeCoverage GitHub top language GitHub contributors Github Issues GitHub OPEN PRs GitHub CLOSED PRs

plotez is a Python library that simplifies common matplotlib plotting tasks with an intuitive API. Create complex plots with minimal boilerplate code.

Project Status

Item Status
Latest version v0.4.0
Python support 3.10 · 3.11 · 3.12
Test coverage 85%+
Type hints PEP 561 compliant (py.typed)
Documentation Read the Docs
Changelog CHANGELOG
License MIT

Features

  • Simple API: Create complex plots with just a few lines of code
  • Error Bar Plotting: Comprehensive error bar support with enhanced styling options
  • Error Band Plotting: Shaded error band support via plot_errorband, plot_errorband_relative, and ErrorBandConfig
  • Histogram & Density Plotting: plot_hist and plot_density with HistogramConfig / hgc
  • Bar & Horizontal Bar Plotting: plot_bar and plot_barh with BarPlotConfig, including per-bar styling via list-valued parameters
  • Dual-Axis Support: Easy creation of dual y-axis or dual x-axis plots
  • Multi-Panel Layouts: Flexible subplot arrangements with automatic labeling
  • File Integration: Direct plotting from CSV files
  • Extensive Customization: Full control over plot appearance via parameter classes
  • Opt-In Styling: Publication-ready style convention is off by default (importing plotez never mutates your project's matplotlib rcParams); opt in via plotez.enable_style() at runtime or the PLOTEZ_AUTO_STYLE environment variable at import time
  • Custom Exceptions: Domain-specific exceptions for clear, catchable error handling
  • Early Input Validation: Clear ShapeError, DataLengthError, and EmptyDataError failures before matplotlib
  • Type Safety: Complete type hints for better IDE support and type checking (PEP 561 compliant)
  • Well Tested: Comprehensive test suite with 85%+ coverage

Installation

From PyPI

pip install plotez

From Source

git clone https://github.com/syedalimohsinbukhari/plotez.git
cd plotez
pip install -e .

Development Installation

pip install -e ".[dev]"

Quick Start

import numpy as np
from plotez import plot_xy

x = np.linspace(0, 10, 100)
y = np.sin(x)
plot_xy(x, y)

README_E1_simple

That's it. Three lines for a labeled plot.

Examples

Scientific Error Bars

import numpy as np
from plotez import ErrorPlotConfig, plot_errorbar

rng = np.random.default_rng(1234)

x = np.linspace(0, 10, 20)
y = np.sin(x)
y_err = 0.2 * rng.random(size=y.shape)

ep = ErrorPlotConfig(color="darkblue", marker="o", capsize=5, ecolor="red", markerfacecolor="lime")
plot_errorbar(x, y, y_err=y_err, errorbar_config=ep)

README_E2_scientific_errorbars

Professional error bars in a few lines of config. ecolor sets the error bar colour independently from the line colour.


Dual Y-Axis

import numpy as np
from plotez import plot_xyy

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.exp(-x / 10)

plot_xyy(x, y1, y2, x_label="Time (s)", y1_label="Signal (V)", y2_label="Decay",
         data_labels=["Oscillation", "Envelope"])

README_E3_dual_y_axis

Dual axes done right. No ax.twinx() gymnastics.


Multi-Panel Grid

import numpy as np
from plotez import n_plotter

x_data = [np.linspace(0, 10, 100) for _ in range(4)]
y_data = [np.sin(x_data[0]), np.cos(x_data[1]),
          np.tan(x_data[2] / 5), x_data[3] ** 2 / 100]

n_plotter(x_data, y_data, n_rows=2, n_cols=2)

README_E4_multi_panel_grid

Four plots, one function call.


Error Bands

Use ErrorBandConfig and LinePlotConfig for explicit, IDE-friendly configuration:

import numpy as np
from plotez import ErrorBandConfig, LinePlotConfig, plot_errorband

x = np.linspace(0, 10, 50)
y = np.sin(x)
y_lower = y - 0.2
y_upper = y + 0.2

band_config = ErrorBandConfig(color="darkblue", alpha=0.25)
plot_config = LinePlotConfig(color="gold", linewidth=2, linestyle="--",
                             marker="o", markersize=5, markeredgecolor="k")

plot_errorband(x, y, y_lower, y_upper,
               data_label="Measurement", band_config=band_config, line_config=plot_config)

README_E5-1_error_band

The same result using the ebc / lpc shorthand aliases — familiar matplotlib parameter names, no class imports needed:

import numpy as np
from plotez import ebc, lpc, plot_errorband

x = np.linspace(0, 10, 50)
y = np.sin(x)
y_lower = y - 0.2
y_upper = y + 0.2

band_config = ebc(c="darkblue", alpha=0.25)
plot_config = lpc(c="gold", lw=2, ls="--", marker="o", ms=5, mec="k")

plot_errorband(x, y, y_lower, y_upper,
               data_label="Measurement", band_config=band_config, line_config=plot_config)

README_E5-2_error_band


Full Customization

import numpy as np
from plotez import LinePlotConfig, plot_xyy

x = np.linspace(0, 10, 50)
y1, y2 = np.sin(x), np.cos(x)

config = LinePlotConfig(
    linestyle=["--", "-."],
    color=["crimson", "gold"],
    marker=["o", "s"],
    markersize=[8, 8],
    markeredgecolor=["black", "black"],
    _extra={"markevery": [5, 5]},
)

plot_xyy(x, y1, y2, plot_config=config)

README_E6_full_customization

Config classes for when defaults aren't enough. Use _extra to pass any matplotlib parameter not covered by the dataclass fields.


Histogram / Density

Use plot_hist with the hgc shorthand to configure and plot a histogram in one go. Switch to plot_density to get normalised probability density instead of raw counts — everything else stays the same. Both functions accept one 1D dataset per call.

import numpy as np
from plotez import hgc, plot_hist

rng = np.random.default_rng(42)
data = rng.normal(loc=0, scale=1, size=5000)

h_cfg = hgc(bins=40, color="steelblue", ec="white", alpha=0.8)
plot_hist(data, x_label="Value", y_label="Counts",
          plot_title="Histogram of Normal Distribution",
          data_label="Normal", hist_config=h_cfg)

README_E7_histogram

Swap plot_hist for plot_density to get the probability density on the y-axis.


Bar Plots

plot_bar and plot_barh share a BarPlotConfig; pass a list for color, edgecolor, linewidth, alpha, width, or hatch to style each bar individually.

import numpy as np
from plotez import BarPlotConfig, plot_bar

categories = ["A", "B", "C", "D", "E"]
values = np.array([23, 45, 12, 39, 28])

b_cfg = BarPlotConfig(color="steelblue", edgecolor="black", alpha=0.85)
plot_bar(categories, values, x_label="Category", y_label="Value", bar_config=b_cfg)

README_E9_bar_plot

Swap plot_bar for plot_barh to flip to horizontal bars — x_data stays the categories, y_data stays the bar lengths.

Opt-In Styling

plotez never changes your project's global matplotlib style just because you imported it. Call plotez.enable_style() to apply its publication-ready convention (serif fonts, grid, tick geometry) at runtime, and plotez.disable_style() to revert to matplotlib's own defaults — or set PLOTEZ_AUTO_STYLE=1 in the environment before import plotez to apply it automatically.

import matplotlib.pyplot as plt
import numpy as np

import plotez
from plotez import plot_errorbar

rng = np.random.default_rng(7)

x = np.linspace(0, 10, 20)
y = np.sin(x)
y_err = 0.2 * rng.random(size=y.shape)


fig = plt.figure(figsize=(15, 4.5))

ax1 = fig.add_subplot(1, 3, 1)
plot_errorbar(x, y, y_err=y_err,
              plot_title="Default (no plotez style)", axis=ax1)

plotez.enable_style()
ax2 = fig.add_subplot(1, 3, 2)
plot_errorbar(x, y, y_err=y_err,
              plot_title="After enable_style()", axis=ax2)

plotez.disable_style()
ax3 = fig.add_subplot(1, 3, 3)
plot_errorbar(x, y, y_err=y_err,
              plot_title="After disable_style()", axis=ax3)

README_E8_style_comparison

Set PLOTEZ_AUTO_STYLE=1 before import plotez to skip the explicit enable_style() call and apply the convention globally for the process.

Development

Running Tests

pytest

With Coverage Report

pytest --cov=src/plotez --cov-report=html

Type Checking

mypy src/plotez

Building Documentation

cd docs
make html

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT License – see LICENSE file for details.

Authors

Links

Download files

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

Source Distribution

plotez-0.4.0.tar.gz (42.1 kB view details)

Uploaded Source

Built Distribution

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

plotez-0.4.0-py3-none-any.whl (25.6 kB view details)

Uploaded Python 3

File details

Details for the file plotez-0.4.0.tar.gz.

File metadata

  • Download URL: plotez-0.4.0.tar.gz
  • Upload date:
  • Size: 42.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for plotez-0.4.0.tar.gz
Algorithm Hash digest
SHA256 ebee8f4a886cf58ed5fe10dd318c2fda7c92e49a562f658bd76b399031fed9a8
MD5 27c69f863c551f79338c23569e4e3252
BLAKE2b-256 1ab01ae0940c1bffffb015505dc0ab3199ef5ab5ab0b6b1dc781413fc5d22e81

See more details on using hashes here.

File details

Details for the file plotez-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: plotez-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 25.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for plotez-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1da94825671267b0afe82b7a42667bf282a353f32fa7bf1d28c33c5e81334502
MD5 11bb925f22009ae14671308056fbd5de
BLAKE2b-256 17d5caccb91c15f44f55e980aa2431f51d6d3a79ecc89b7f007196070efc7a71

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.4.0 This release

2 files

0.3.3.post1

2 files

0.3.3

2 files

0.3.2.post1

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.1

2 files

0.2.0

2 files

0.1.1

2 files

0.1.0

2 files

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