Interoperability and API stability

Headless and servers

Set the backend to Agg (or another non-interactive backend) before importing pyplot if you run without a display:

import matplotlib
matplotlib.use("Agg")

import matplotlib.pyplot as plt
import signalplot as sp

The documentation build and tests use this pattern. Close figures you no longer need (plt.close(fig) or plt.close("all")) when generating many plots in one process to limit memory growth.

Jupyter and Quarto

Call apply() in the first cell of a notebook (or once per Quarto chunk that defines plotting) so all subsequent cells share the same defaults. Inline displays use the active backend; save() still writes files when you export for publication.

Stability expectations

Names listed in signalplot.__all__ are the intended public surface for semantic versioning: breaking changes should come with a major version bump. Callers should import from the signalplot package rather than submodules (signalplot.style, signalplot.axes, and so on), since submodule layout may evolve as long as the top-level exports remain compatible.

Helpers beyond the short list documented as “stable high-level API” in the package docstring may still change in minor releases if the README style contract stays satisfied—when in doubt, pin your dependency version and read the changelog.