From 2e54bedd13004719c2b113a744b5a5ae1781733a Mon Sep 17 00:00:00 2001 From: Paul Hobson Date: Wed, 21 Oct 2026 18:27:16 -0700 Subject: [PATCH] add a quick example for altair --- docs/altair/altair_probscale.png | Bin 0 -> 243774 bytes docs/altair/altair_probscale.py | 81 ++++++++++++++++++++++++++++++ docs/altair/index.rst | 30 +++++++++++ docs/index.rst | 1 + pyproject.toml | 1 + uv.lock | 83 ++++++++++++++++--------------- 6 files changed, 155 insertions(+), 41 deletions(-) create mode 100644 docs/altair/altair_probscale.png create mode 100644 docs/altair/altair_probscale.py create mode 100644 docs/altair/index.rst diff --git a/docs/altair/altair_probscale.png b/docs/altair/altair_probscale.png new file mode 100644 index 0000000000000000000000000000000000000000..e68f9e4c10cf13d758667bd2c09a1c6b5c700655 GIT binary patch literal 243774 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
  • gt#Kj5KK0wj_46f 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 T>&gGkxZ&%6_r%}ccF+F=6.3.0", +# "numpy>=2.5.4", +# "pandas>=3.0.6", +# "scipy>=1.18.1", +# "vl-convert-python>=1.9.0.post1", +# ] +# /// + +"""Probability plot (normal distribution) in Altair / Vega-Lite. + +Vega-Lite has no probit scale, but the same effect is achieved by: + 1. computing plotting positions and transforming them with the normal + quantile function (probit) *inside the spec* via Vega's `quantileNormal`, + 2. placing axis ticks at the probit of familiar percentages and relabelling + them with `cumulativeNormal` (the inverse transform). +""" + +from pathlib import Path + +import altair as alt +import numpy as np +import pandas as pd +from scipy import stats + +PERCENTS = [0.5, 1, 2, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 98, 99, 99.5] + + +def probability_plot(df, value, title=None, a=0.0, direction="x"): + """Probability plot of `df[value]`; `direction` is the axis holding probabilities.""" + + probit_ticks = [float(stats.norm.ppf(p / 100)) for p in PERCENTS] + label_expr = "format(100 * cumulativeNormal(datum.value, 0, 1), '.4~f')" + + # Weibull-style plotting positions (i - a) / (n + 1 - 2a), a=0 by default + base = ( + alt.Chart(df) + .transform_window(rank="rank()", sort=[alt.SortField(value)]) + .transform_joinaggregate(n="count()") + .transform_calculate( + prob=f"(datum.rank - {a}) / (datum.n + 1 - {2 * a})", + z="quantileNormal(datum.prob, 0, 1)", + ) + ) + + prob_enc = alt.Axis( + values=probit_ticks, labelExpr=label_expr, title="Non-exceedance probability", + grid=True, + ) + prob_scale = alt.Scale(domain=[probit_ticks[0] - 0.3, probit_ticks[-1] + 0.3]) + prob_ch = alt.X if direction == "x" else alt.Y + val_ch = alt.Y if direction == "x" else alt.X + + points = base.mark_point(filled=True, size=40).encode( + prob_ch("z:Q", axis=prob_enc, scale=prob_scale), + val_ch(f"{value}:Q", scale=alt.Scale(zero=False), title=value), + tooltip=[value, alt.Tooltip("prob:Q", format=".3f")], + ) + + # Least-squares best-fit line in probit space (the normal fit) + fit = ( + base.transform_regression("z", value, method="linear") + if direction == "x" + else base.transform_regression(value, "z", method="linear") + ).mark_line(color="firebrick") + fit = fit.encode( + prob_ch("z:Q", axis=prob_enc, scale=prob_scale), + val_ch(f"{value}:Q"), + ) + return (points + fit).properties(width=500, height=350, title=title or "Normal probability plot") + + +if __name__ == "__main__": + rng = np.random.default_rng(0) + data = pd.DataFrame({"conc": np.hstack([rng.normal(10, 2, 80), rng.normal(18, 3, 20)])}) + chart = probability_plot(data, "conc", direction="x") + here = Path(__file__).parent + chart.save(here / "altair_probscale.png", scale_factor=2) + print("wrote altair_probscale.png") diff --git a/docs/altair/index.rst b/docs/altair/index.rst new file mode 100644 index 0000000..bee16ca --- /dev/null +++ b/docs/altair/index.rst @@ -0,0 +1,30 @@ +Probability plots in Altair / Vega-Lite +======================================= + +.. note:: + + This is a standalone sketch for people working in Vega-Lite, not part of + the mpl-probscale API. It is not run during the docs build and is not + covered by the test suite. Altair is not a dependency of this package. + +Vega-Lite has no probit scale, but a normal probability plot can be built +from two pieces: + +1. Plotting positions are computed inside the spec and passed through + Vega's ``quantileNormal`` function to get z-scores. +2. Axis ticks are placed at the z-scores of familiar percentages and + relabelled with ``cumulativeNormal``, the inverse transform. + +A least-squares line fit in z-space serves as the normal-distribution fit. + +.. image:: altair_probscale.png + :width: 600 + +The full script (``uv add altair vl-convert-python`` to run it): + +.. literalinclude:: altair_probscale.py + :language: python + +Limitations compared to mpl-probscale: only the normal distribution, no +confidence bands, fixed tick locations, and a single plotting-position +formula (via the ``a`` argument). diff --git a/docs/index.rst b/docs/index.rst index 2d1fb0b..1e21571 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -54,6 +54,7 @@ Examples :maxdepth: 2 auto_examples/index + altair/index API Reference ------------- diff --git a/pyproject.toml b/pyproject.toml index f47881f..0bf0979 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,6 +49,7 @@ docs = [ "sphinx>=8", "sphinx-gallery>=0.19", ] +extra = [] [project.urls] Homepage = "https://github.com/matplotlib/mpl-probscale" diff --git a/uv.lock b/uv.lock index 8a69f4d..a8beeac 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 5 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", @@ -97,7 +97,7 @@ name = "cffi" version = "2.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, + { name = "pycparser" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } wheels = [ @@ -383,7 +383,7 @@ resolution-markers = [ "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } wheels = [ @@ -473,7 +473,7 @@ resolution-markers = [ "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.5.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.5.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/83/5a/a55177dd22553a277388e8a1b3220e92de91bacb28356cdc73caa240121d/contourpy-1.4.0.tar.gz", hash = "sha256:20156f5a1ac4f8ce02656e39a61e82164a3d359796dc8026f75b062783d500e1", size = 13323726, upload-time = "2026-09-11T19:05:05.808Z" } wheels = [ @@ -1643,7 +1643,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "ptyprocess" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ @@ -1828,6 +1828,7 @@ docs = [ { name = "sphinx", specifier = ">=8" }, { name = "sphinx-gallery", specifier = ">=0.19" }, ] +extra = [] [[package]] name = "prompt-toolkit" @@ -2317,7 +2318,7 @@ resolution-markers = [ "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } wheels = [ @@ -2396,7 +2397,7 @@ resolution-markers = [ "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.5.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.5.3", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/7e/74/66de6258867beb2ef08f35f9f2ac017a52cacd5081714d239ff1a442d458/scipy-1.18.1.tar.gz", hash = "sha256:52c4b7422442aba924d03ad4019852b08a92e64ea187b933135687bfe2747307", size = 30781235, upload-time = "2026-08-21T23:28:50.599Z" } wheels = [ @@ -2514,23 +2515,23 @@ resolution-markers = [ "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "alabaster", marker = "python_full_version < '3.12'" }, - { name = "babel", marker = "python_full_version < '3.12'" }, - { name = "colorama", marker = "python_full_version < '3.12' and sys_platform == 'win32'" }, - { name = "docutils", marker = "python_full_version < '3.12'" }, - { name = "imagesize", marker = "python_full_version < '3.12'" }, - { name = "jinja2", marker = "python_full_version < '3.12'" }, - { name = "packaging", marker = "python_full_version < '3.12'" }, - { name = "pygments", marker = "python_full_version < '3.12'" }, - { name = "requests", marker = "python_full_version < '3.12'" }, - { name = "roman-numerals", marker = "python_full_version < '3.12'" }, - { name = "snowballstemmer", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.12'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.12'" }, + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } wheels = [ @@ -2550,23 +2551,23 @@ resolution-markers = [ "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "alabaster", marker = "python_full_version >= '3.12'" }, - { name = "babel", marker = "python_full_version >= '3.12'" }, - { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, - { name = "docutils", marker = "python_full_version >= '3.12'" }, - { name = "imagesize", marker = "python_full_version >= '3.12'" }, - { name = "jinja2", marker = "python_full_version >= '3.12'" }, - { name = "packaging", marker = "python_full_version >= '3.12'" }, - { name = "pygments", marker = "python_full_version >= '3.12'" }, - { name = "requests", marker = "python_full_version >= '3.12'" }, - { name = "roman-numerals", marker = "python_full_version >= '3.12'" }, - { name = "snowballstemmer", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" }, + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "roman-numerals" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } wheels = [