From 1ad6e44294cee16f4b048a13d953e6538bec7f05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trygve=20Magnus=20R=C3=A6der?= Date: Wed, 7 Aug 2024 15:16:40 +0200 Subject: [PATCH 01/12] MultiNorm class --- lib/matplotlib/colors.py | 241 ++++++++++++++++++++++++++++++++++++++ lib/matplotlib/colors.pyi | 32 +++++ 2 files changed, 273 insertions(+) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index e3c3b39e8bb2..46469f0b25a2 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -2320,6 +2320,16 @@ def __init__(self, vmin=None, vmax=None, clip=False): self._scale = None self.callbacks = cbook.CallbackRegistry(signals=["changed"]) + @property + def n_input(self): + # To be overridden by subclasses with multiple inputs + return 1 + + @property + def n_output(self): + # To be overridden by subclasses with multiple outputs + return 1 + @property def vmin(self): return self._vmin @@ -3219,6 +3229,237 @@ def inverse(self, value): return value +class MultiNorm(Normalize): + """ + A mixin class which contains multiple scalar norms + """ + + def __init__(self, norms, vmin=None, vmax=None, clip=False): + """ + Parameters + ---------- + norms : List of strings or `Normalize` objects + The constituent norms. The list must have a minimum length of 2. + vmin, vmax : float, None, or list of float or None + Limits of the constituent norms. + If a list, each each value is assigned to one of the constituent + norms. Single values are repeated to form a list of appropriate size. + + clip : bool or list of bools, default: False + Determines the behavior for mapping values outside the range + ``[vmin, vmax]`` for the constituent norms. + If a list, each each value is assigned to one of the constituent + norms. Single values are repeated to form a list of appropriate size. + + """ + + if isinstance(norms, str) or not np.iterable(norms): + raise ValueError("A MultiNorm must be assigned multiple norms") + norms = [n for n in norms] + for i, n in enumerate(norms): + if n is None: + norms[i] = Normalize() + elif isinstance(n, str): + try: + scale_cls = scale._scale_mapping[n] + except KeyError: + raise ValueError( + "Invalid norm str name; the following values are " + f"supported: {', '.join(scale._scale_mapping)}" + ) from None + norms[i] = mpl.colorizer._auto_norm_from_scale(scale_cls)() + + # Convert the list of norms to a tuple to make it immutable. + # If there is a use case for swapping a single norm, we can add support for + # that later + self._norms = tuple(n for n in norms) + + self.callbacks = cbook.CallbackRegistry(signals=["changed"]) + + self.vmin = vmin + self.vmax = vmax + self.clip = clip + + self._id_norms = [n.callbacks.connect('changed', + self._changed) for n in self._norms] + + @property + def n_input(self): + return len(self._norms) + + @property + def n_output(self): + return len(self._norms) + + @property + def norms(self): + return self._norms + + @property + def vmin(self): + return tuple(n.vmin for n in self._norms) + + @vmin.setter + def vmin(self, value): + if not np.iterable(value): + value = [value]*self.n_input + if len(value) != self.n_input: + raise ValueError(f"Invalid vmin for `MultiNorm` with {self.n_input}" + " inputs.") + with self.callbacks.blocked(): + for i, v in enumerate(value): + if v is not None: + self.norms[i].vmin = v + self._changed() + + @property + def vmax(self): + return tuple(n.vmax for n in self._norms) + + @vmax.setter + def vmax(self, value): + if not np.iterable(value): + value = [value]*self.n_input + if len(value) != self.n_input: + raise ValueError(f"Invalid vmax for `MultiNorm` with {self.n_input}" + " inputs.") + with self.callbacks.blocked(): + for i, v in enumerate(value): + if v is not None: + self.norms[i].vmax = v + self._changed() + + @property + def clip(self): + return tuple(n.clip for n in self._norms) + + @clip.setter + def clip(self, value): + if not np.iterable(value): + value = [value]*self.n_input + with self.callbacks.blocked(): + for i, v in enumerate(value): + if v is not None: + self.norms[i].clip = v + self._changed() + + def _changed(self): + """ + Call this whenever the norm is changed to notify all the + callback listeners to the 'changed' signal. + """ + self.callbacks.process('changed') + + def __call__(self, value, clip=None): + """ + Normalize the data and return the normalized data. + Each variate in the input is assigned to the a constituent norm. + + Parameters + ---------- + value + Data to normalize. Must be of length `n_input` or have a data type with + `n_input` fields. + clip : List of bools or bool, optional + See the description of the parameter *clip* in Normalize. + If ``None``, defaults to ``self.clip`` (which defaults to + ``False``). + + Returns + ------- + Data + Normalized input values as a list of length `n_input` + + Notes + ----- + If not already initialized, ``self.vmin`` and ``self.vmax`` are + initialized using ``self.autoscale_None(value)``. + """ + if clip is None: + clip = self.clip + else: + if not np.iterable(clip): + value = [value]*self.n_input + + value = self._iterable_variates_in_data(value, self.n_input) + result = [n(v, clip=c) for n, v, c in zip(self.norms, value, clip)] + return result + + def inverse(self, value): + """ + Maps the normalized value (i.e., index in the colormap) back to image + data value. + + Parameters + ---------- + value + Normalized value. Must be of length `n_input` or have a data type with + `n_input` fields. + """ + value = self._iterable_variates_in_data(value, self.n_input) + result = [n.inverse(v) for n, v in zip(self.norms, value)] + return result + + def autoscale(self, A): + """ + For each constituent norm, Set *vmin*, *vmax* to min, max of the corresponding + variate in *A*. + """ + with self.callbacks.blocked(): + # Pause callbacks while we are updating so we only get + # a single update signal at the end + self.vmin = self.vmax = None + self.autoscale_None(A) + + def autoscale_None(self, A): + """ + If *vmin* or *vmax* are not set on any constituent norm, + use the min/max of the corresponding variate in *A* to set them. + + Parameters + ---------- + A + Data, must be of length `n_input` or be an np.ndarray type with + `n_input` fields. + """ + with self.callbacks.blocked(): + A = self._iterable_variates_in_data(A, self.n_input) + for n, a in zip(self.norms, A): + n.autoscale_None(a) + self._changed() + + def scaled(self): + """Return whether both *vmin* and *vmax* are set on all constitient norms""" + return all([(n.vmin is not None and n.vmax is not None) for n in self.norms]) + + @staticmethod + def _iterable_variates_in_data(data, n_input): + """ + Provides an iterable over the variates contained in the data. + + An input array with n_input fields is returned as a list of length n referencing + slices of the original array. + + Parameters + ---------- + data : np.ndarray, tuple or list + The input array. It must either be an array with n_input fields or have + a length (n_input) + + Returns + ------- + list of np.ndarray + + """ + if isinstance(data, np.ndarray) and data.dtype.fields is not None: + data = [data[descriptor[0]] for descriptor in data.dtype.descr] + if not len(data) == n_input: + raise ValueError("The input to this `MultiNorm` must be of shape " + f"({n_input}, ...), or have a data type with {n_input} " + "fields.") + return data + + def rgb_to_hsv(arr): """ Convert an array of float RGB values (in the range [0, 1]) to HSV values. diff --git a/lib/matplotlib/colors.pyi b/lib/matplotlib/colors.pyi index 3e761c949068..20fb734bf8a8 100644 --- a/lib/matplotlib/colors.pyi +++ b/lib/matplotlib/colors.pyi @@ -263,6 +263,10 @@ class Normalize: @vmax.setter def vmax(self, value: float | None) -> None: ... @property + def n_input(self) -> int: ... + @property + def n_output(self) -> int: ... + @property def clip(self) -> bool: ... @clip.setter def clip(self, value: bool) -> None: ... @@ -387,6 +391,34 @@ class BoundaryNorm(Normalize): class NoNorm(Normalize): ... +class MultiNorm(Normalize): + # Here "type: ignore[override]" is used for functions with a return type + # that differs from the function in the base class. + # i.e. where `MultiNorm` returns a tuple and Normalize returns a `float` etc. + def __init__( + self, + norms: ArrayLike, + vmin: ArrayLike | float | None = ..., + vmax: ArrayLike | float | None = ..., + clip: ArrayLike | bool = ... + ) -> None: ... + @property + def norms(self) -> tuple: ... + @property # type: ignore[override] + def vmin(self) -> tuple[float | None]: ... + @vmin.setter + def vmin(self, value: ArrayLike | float | None) -> None: ... + @property # type: ignore[override] + def vmax(self) -> tuple[float | None]: ... + @vmax.setter + def vmax(self, value: ArrayLike | float | None) -> None: ... + @property # type: ignore[override] + def clip(self) -> tuple[bool]: ... + @clip.setter + def clip(self, value: ArrayLike | bool) -> None: ... + def __call__(self, value: ArrayLike, clip: ArrayLike | bool | None) -> list: ... # type: ignore[override] + def inverse(self, value: ArrayLike) -> list: ... # type: ignore[override] + def rgb_to_hsv(arr: ArrayLike) -> np.ndarray: ... def hsv_to_rgb(hsv: ArrayLike) -> np.ndarray: ... From b00cf92d6d3a8fbc9fe04b0348d1cba47a717bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trygve=20Magnus=20R=C3=A6der?= Date: Wed, 7 Aug 2024 15:49:39 +0200 Subject: [PATCH 02/12] Multivariate plots for imshow, pcolor and pcolormesh --- lib/matplotlib/axes/_axes.py | 36 +- lib/matplotlib/cbook.py | 12 +- lib/matplotlib/cm.py | 29 - lib/matplotlib/collections.py | 8 +- lib/matplotlib/colorizer.py | 234 +++++- lib/matplotlib/colors.pyi | 2 +- lib/matplotlib/image.py | 33 +- lib/matplotlib/streamplot.py | 4 +- .../bivar_cmap_from_image.png | Bin 0 -> 5257 bytes .../bivariate_cmap_call.png | Bin 0 -> 10570 bytes .../bivariate_cmap_shapes.png | Bin 0 -> 5073 bytes .../bivariate_masked_data.png | Bin 0 -> 15397 bytes .../bivariate_visualizations.png | Bin 0 -> 10840 bytes .../multivar_cmap_call.png | Bin 0 -> 10318 bytes .../multivariate_figimage.png | Bin 0 -> 86640 bytes .../multivariate_imshow_alpha.png | Bin 0 -> 8894 bytes .../multivariate_imshow_complex_data.png | Bin 0 -> 2538 bytes .../multivariate_imshow_norm.png | Bin 0 -> 12347 bytes .../multivariate_pcolormesh_alpha.png | Bin 0 -> 7536 bytes .../multivariate_pcolormesh_norm.png | Bin 0 -> 10588 bytes .../multivariate_visualizations.png | Bin 0 -> 10737 bytes .../tests/test_multivariate_axes.py | 681 ++++++++++++++++++ 22 files changed, 967 insertions(+), 72 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivar_cmap_from_image.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_cmap_call.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_cmap_shapes.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_masked_data.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_visualizations.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivar_cmap_call.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_figimage.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_imshow_alpha.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_imshow_complex_data.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_imshow_norm.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_pcolormesh_alpha.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_pcolormesh_norm.png create mode 100644 lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_visualizations.png create mode 100644 lib/matplotlib/tests/test_multivariate_axes.py diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index b46cbce39c58..3f979f532c6f 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -6190,6 +6190,21 @@ def pcolor(self, *args, shading=None, alpha=None, norm=None, cmap=None, if shading is None: shading = mpl.rcParams['pcolor.shading'] shading = shading.lower() + + mcolorizer.ColorizingArtist._check_exclusionary_keywords(colorizer, + vmin=vmin, + vmax=vmax) + + # we need to get the colorizer object to know the number of + # n_variates that should exist in the array, we therefore get the + # colorizer here. + colorizer = mcolorizer.ColorizingArtist._get_colorizer(norm=norm, + cmap=cmap, + colorizer=colorizer) + if colorizer.norm.n_input > 1: + data = mcolorizer._ensure_multivariate_data(colorizer.norm.n_input, args[0]) + args = (data, *args[1:]) + X, Y, C, shading = self._pcolorargs('pcolor', *args, shading=shading, kwargs=kwargs) linewidths = (0.25,) @@ -6226,9 +6241,8 @@ def pcolor(self, *args, shading=None, alpha=None, norm=None, cmap=None, coords = stack([X, Y], axis=-1) collection = mcoll.PolyQuadMesh( - coords, array=C, cmap=cmap, norm=norm, colorizer=colorizer, + coords, array=C, colorizer=colorizer, alpha=alpha, **kwargs) - collection._check_exclusionary_keywords(colorizer, vmin=vmin, vmax=vmax) collection._scale_norm(norm, vmin, vmax) coords = coords.reshape(-1, 2) # flatten the grid structure; keep x, y @@ -6429,6 +6443,20 @@ def pcolormesh(self, *args, alpha=None, norm=None, cmap=None, vmin=None, shading = mpl._val_or_rc(shading, 'pcolor.shading').lower() kwargs.setdefault('edgecolors', 'none') + mcolorizer.ColorizingArtist._check_exclusionary_keywords(colorizer, + vmin=vmin, + vmax=vmax) + # we need to get the colorizer object to know the number of + # n_variates that should exist in the array, we therefore get the + # colorizer here. + colorizer_obj = mcolorizer.ColorizingArtist._get_colorizer(norm=norm, + cmap=cmap, + colorizer=colorizer) + if colorizer_obj.norm.n_input > 1: + data = mcolorizer._ensure_multivariate_data(colorizer_obj.norm.n_input, + args[-1]) + args = (*args[:-1], data) + X, Y, C, shading = self._pcolorargs('pcolormesh', *args, shading=shading, kwargs=kwargs) coords = np.stack([X, Y], axis=-1) @@ -6437,8 +6465,8 @@ def pcolormesh(self, *args, alpha=None, norm=None, cmap=None, vmin=None, collection = mcoll.QuadMesh( coords, antialiased=antialiased, shading=shading, - array=C, cmap=cmap, norm=norm, colorizer=colorizer, alpha=alpha, **kwargs) - collection._check_exclusionary_keywords(colorizer, vmin=vmin, vmax=vmax) + array=C, colorizer=colorizer_obj, + alpha=alpha, **kwargs) collection._scale_norm(norm, vmin, vmax) coords = coords.reshape(-1, 2) # flatten the grid structure; keep x, y diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index d90921158ee5..683f62763cb8 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -690,7 +690,17 @@ def safe_masked_invalid(x, copy=False): try: xm = np.ma.masked_where(~(np.isfinite(x)), x, copy=False) except TypeError: - return x + if len(x.dtype.descr) == 1: + return x + else: + # in case of a dtype with multiple fields: + try: + mask = np.empty(x.shape, dtype=np.dtype('bool, '*len(x.dtype.descr))) + for dd, dm in zip(x.dtype.descr, mask.dtype.descr): + mask[dm[0]] = ~(np.isfinite(x[dd[0]])) + xm = np.ma.array(x, mask=mask, copy=False) + except TypeError: + return x return xm diff --git a/lib/matplotlib/cm.py b/lib/matplotlib/cm.py index 2697666b9573..d8c3dafcfe46 100644 --- a/lib/matplotlib/cm.py +++ b/lib/matplotlib/cm.py @@ -278,32 +278,3 @@ def get_cmap(name=None, lut=None): return _colormaps[name] else: return _colormaps[name].resampled(lut) - - -def _ensure_cmap(cmap): - """ - Ensure that we have a `.Colormap` object. - - For internal use to preserve type stability of errors. - - Parameters - ---------- - cmap : None, str, Colormap - - - if a `Colormap`, return it - - if a string, look it up in mpl.colormaps - - if None, look up the default color map in mpl.colormaps - - Returns - ------- - Colormap - - """ - if isinstance(cmap, colors.Colormap): - return cmap - cmap_name = mpl._val_or_rc(cmap, "image.cmap") - # use check_in_list to ensure type stability of the exception raised by - # the internal usage of this (ValueError vs KeyError) - if cmap_name not in _colormaps: - _api.check_in_list(sorted(_colormaps), cmap=cmap_name) - return mpl.colormaps[cmap_name] diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index ab1bd337d805..619e99ad7e2f 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -2611,10 +2611,16 @@ def _get_unmasked_polys(self): arr = self.get_array() if arr is not None: arr = np.ma.getmaskarray(arr) - if arr.ndim == 3: + if self.norm.n_input > 1: + # multivar case + for a in mcolors.MultiNorm._iterable_variates_in_data( + arr, self.norm.n_input): + mask |= np.any(a, axis=0) + elif arr.ndim == 3: # RGB(A) case mask |= np.any(arr, axis=-1) elif arr.ndim == 2: + # scalar case mask |= arr else: mask |= arr.reshape(self._coordinates[:-1, :-1, :].shape[:2]) diff --git a/lib/matplotlib/colorizer.py b/lib/matplotlib/colorizer.py index b4223f389804..3fa9e1394863 100644 --- a/lib/matplotlib/colorizer.py +++ b/lib/matplotlib/colorizer.py @@ -24,7 +24,7 @@ import numpy as np from numpy import ma -from matplotlib import _api, colors, cbook, scale, artist +from matplotlib import _api, colors, cbook, scale, artist, cm import matplotlib as mpl mpl._docstring.interpd.register( @@ -90,19 +90,7 @@ def norm(self): @norm.setter def norm(self, norm): - _api.check_isinstance((colors.Normalize, str, None), norm=norm) - if norm is None: - norm = colors.Normalize() - elif isinstance(norm, str): - try: - scale_cls = scale._scale_mapping[norm] - except KeyError: - raise ValueError( - "Invalid norm str name; the following values are " - f"supported: {', '.join(scale._scale_mapping)}" - ) from None - norm = _auto_norm_from_scale(scale_cls)() - + norm = _ensure_norm(norm, n_variates=self.cmap.n_variates) if norm is self.norm: # We aren't updating anything return @@ -232,9 +220,14 @@ def _set_cmap(self, cmap): cmap : `.Colormap` or str or None """ # bury import to avoid circular imports - from matplotlib import cm in_init = self._cmap is None - self._cmap = cm._ensure_cmap(cmap) + cmap_obj = _ensure_cmap(cmap, accept_multivariate=True) + if not in_init: + if self.norm.n_output != cmap_obj.n_variates: + raise ValueError(f"The colormap {cmap} does not support " + f"{self.norm.n_output} variates as required by " + "the norm on this Colorizer.") + self._cmap = cmap_obj if not in_init: self.changed() # Things are not set up properly yet. @@ -255,31 +248,35 @@ def set_clim(self, vmin=None, vmax=None): vmin, vmax : float The limits. - The limits may also be passed as a tuple (*vmin*, *vmax*) as a - single positional argument. + For scalar data, the limits may also be passed as a + tuple (*vmin*, *vmax*) as a single positional argument. .. ACCEPTS: (vmin: float, vmax: float) """ + if self.norm.n_input == 1: + if vmax is None: + try: + vmin, vmax = vmin + except (TypeError, ValueError): + pass + # If the norm's limits are updated self.changed() will be called # through the callbacks attached to the norm, this causes an inconsistent # state, to prevent this blocked context manager is used - if vmax is None: - try: - vmin, vmax = vmin - except (TypeError, ValueError): - pass - orig_vmin_vmax = self.norm.vmin, self.norm.vmax # Blocked context manager prevents callbacks from being triggered # until both vmin and vmax are updated with self.norm.callbacks.blocked(signal='changed'): + # Tote that the @vmin/vmax.setter invokes + # colors._sanitize_extrema() to sanitize the input + # The input is not sanitized here because + # colors._sanitize_extrema() does not handle multivariate input. if vmin is not None: - self.norm.vmin = colors._sanitize_extrema(vmin) + self.norm.vmin = vmin if vmax is not None: - self.norm.vmax = colors._sanitize_extrema(vmax) + self.norm.vmax = vmax - # emit a update signal if the limits are changed if orig_vmin_vmax != (self.norm.vmin, self.norm.vmax): self.norm.callbacks.process('changed') @@ -563,10 +560,18 @@ def set_array(self, A): self._A = None return + A = _ensure_multivariate_data(self.norm.n_input, A) + A = cbook.safe_masked_invalid(A, copy=True) if not np.can_cast(A.dtype, float, "same_kind"): - raise TypeError(f"Image data of dtype {A.dtype} cannot be " - "converted to float") + if A.dtype.fields is None: + raise TypeError(f"Image data of dtype {A.dtype} cannot be " + f"converted to float") + else: + for key in A.dtype.fields: + if not np.can_cast(A[key].dtype, float, "same_kind"): + raise TypeError(f"Image data of dtype {A.dtype} cannot be " + f"converted to a sequence of floats") self._A = A if not self.norm.scaled(): @@ -701,3 +706,174 @@ def _auto_norm_from_scale(scale_cls): norm = colors.make_norm_from_scale(scale_cls)( colors.Normalize)() return type(norm) + + +def _ensure_norm(norm, n_variates=1): + if n_variates == 1: + _api.check_isinstance((colors.Normalize, str, None), norm=norm) + if norm is None: + norm = colors.Normalize() + elif isinstance(norm, str): + try: + scale_cls = scale._scale_mapping[norm] + except KeyError: + raise ValueError( + "Invalid norm str name; the following values are " + f"supported: {', '.join(scale._scale_mapping)}" + ) from None + norm = _auto_norm_from_scale(scale_cls)() + return norm + else: # n_variates > 1 + if not np.iterable(norm): + # include tuple in the list to improve error message + _api.check_isinstance((colors.Normalize, str, None, tuple), norm=norm) + if norm is None: + norm = colors.MultiNorm([None]*n_variates) + elif isinstance(norm, str): # single string + norm = colors.MultiNorm([norm]*n_variates) + else: # multiple string or objects + norm = colors.MultiNorm(norm) + if isinstance(norm, colors.Normalize) and norm.n_output == n_variates: + return norm + raise ValueError( + "Invalid norm for multivariate colormap with " + f"{n_variates} inputs." + ) + + +def _ensure_cmap(cmap, accept_multivariate=False): + """ + Ensure that we have a `.Colormap` object. + + For internal use to preserve type stability of errors. + + Parameters + ---------- + cmap : None, str, Colormap + + - if a `~matplotlib.colors.Colormap`, + `~matplotlib.colors.MultivarColormap` or + `~matplotlib.colors.BivarColormap`, + return it + - if a string, look it up in three corresponding databases + when not found: raise an error based on the expected shape + - if None, look up the default color map in mpl.colormaps + accept_multivariate : bool, default True + - if False, accept only Colormap, string in mpl.colormaps or None + + Returns + ------- + Colormap + + """ + if not accept_multivariate: + if isinstance(cmap, colors.Colormap): + return cmap + cmap_name = cmap if cmap is not None else mpl.rcParams["image.cmap"] + # use check_in_list to ensure type stability of the exception raised by + # the internal usage of this (ValueError vs KeyError) + if cmap_name not in mpl.colormaps: + _api.check_in_list(sorted(mpl.colormaps), cmap=cmap_name) + + if isinstance(cmap, (colors.Colormap, + colors.BivarColormap, + colors.MultivarColormap)): + return cmap + cmap_name = cmap if cmap is not None else mpl.rcParams["image.cmap"] + if cmap_name in mpl.colormaps: + return mpl.colormaps[cmap_name] + if cmap_name in mpl.multivar_colormaps: + return mpl.multivar_colormaps[cmap_name] + if cmap_name in mpl.bivar_colormaps: + return mpl.bivar_colormaps[cmap_name] + + # this error message is a variant of _api.check_in_list but gives + # additional hints as to how to access multivariate colormaps + + msg = f"{cmap!r} is not a valid value for cmap" + msg += "; supported values for scalar colormaps are " + msg += f"{', '.join(map(repr, sorted(mpl.colormaps)))}\n" + msg += "See matplotlib.bivar_colormaps() and" + msg += " matplotlib.multivar_colormaps() for" + msg += " bivariate and multivariate colormaps." + + raise ValueError(msg) + + if isinstance(cmap, colors.Colormap): + return cmap + cmap_name = cmap if cmap is not None else mpl.rcParams["image.cmap"] + # use check_in_list to ensure type stability of the exception raised by + # the internal usage of this (ValueError vs KeyError) + if cmap_name not in cm.colormaps: + _api.check_in_list(sorted(cm.colormaps), cmap=cmap_name) + return cm.colormaps[cmap_name] + + +def _ensure_multivariate_data(n_input, data): + """ + Ensure that the data has dtype with n_input. + Input data of shape (n_input, n, m) is converted to an array of shape + (n, m) with data type np.dtype(f'{data.dtype}, ' * n_input) + Complex data is returned as a view with dtype np.dtype('float64, float64') + or np.dtype('float32, float32') + If n_input is 1 and data is not of type np.ndarray (i.e. PIL.Image), + the data is returned unchanged. + If data is None, the function returns None + Parameters + ---------- + n_input : int + - number of variates in the data + data : np.ndarray, PIL.Image or None + Returns + ------- + np.ndarray, PIL.Image or None + """ + + if isinstance(data, np.ndarray): + if len(data.dtype.descr) == n_input: + # pass scalar data + # and already formatted data + return data + elif data.dtype in [np.complex64, np.complex128]: + # pass complex data + if data.dtype == np.complex128: + dt = np.dtype('float64, float64') + else: + dt = np.dtype('float32, float32') + reconstructed = np.ma.frombuffer(data.data, dtype=dt).reshape(data.shape) + if np.ma.is_masked(data): + for descriptor in dt.descr: + reconstructed[descriptor[0]][data.mask] = np.ma.masked + return reconstructed + + if n_input > 1 and len(data) == n_input: + # convert data from shape (n_input, n, m) + # to (n,m) with a new dtype + data = [np.ma.array(part, copy=False) for part in data] + dt = np.dtype(', '.join([f'{part.dtype}' for part in data])) + fields = [descriptor[0] for descriptor in dt.descr] + reconstructed = np.ma.empty(data[0].shape, dtype=dt) + for i, f in enumerate(fields): + if data[i].shape != reconstructed.shape: + raise ValueError("For multivariate data all variates must have same " + f"shape, not {data[0].shape} and {data[i].shape}") + reconstructed[f] = data[i] + if np.ma.is_masked(data[i]): + reconstructed[f][data[i].mask] = np.ma.masked + return reconstructed + + if data is None: + return data + + if n_input == 1: + # PIL.Image also gets passed here + return data + + elif n_input == 2: + raise ValueError("Invalid data entry for mutlivariate data. The data" + " must contain complex numbers, or have a first dimension 2," + " or be of a dtype with 2 fields") + else: + raise ValueError("Invalid data entry for mutlivariate data. The shape" + f" of the data must have a first dimension {n_input}" + f" or be of a dtype with {n_input} fields") diff --git a/lib/matplotlib/colors.pyi b/lib/matplotlib/colors.pyi index 20fb734bf8a8..3f9e0c9d93e8 100644 --- a/lib/matplotlib/colors.pyi +++ b/lib/matplotlib/colors.pyi @@ -416,7 +416,7 @@ class MultiNorm(Normalize): def clip(self) -> tuple[bool]: ... @clip.setter def clip(self, value: ArrayLike | bool) -> None: ... - def __call__(self, value: ArrayLike, clip: ArrayLike | bool | None) -> list: ... # type: ignore[override] + def __call__(self, value: ArrayLike, clip: ArrayLike | bool | None = ...) -> list: ... # type: ignore[override] def inverse(self, value: ArrayLike) -> list: ... # type: ignore[override] def rgb_to_hsv(arr: ArrayLike) -> np.ndarray: ... diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index bd1254c27fe1..a6f74cbd6e97 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -641,18 +641,35 @@ def write_png(self, fname): PIL.Image.fromarray(im).save(fname, format="png") @staticmethod - def _normalize_image_array(A): + def _normalize_image_array(A, n_input=1): """ Check validity of image-like input *A* and normalize it to a format suitable for Image subclasses. """ + A = mcolorizer._ensure_multivariate_data(n_input, A) A = cbook.safe_masked_invalid(A, copy=True) - if A.dtype != np.uint8 and not np.can_cast(A.dtype, float, "same_kind"): - raise TypeError(f"Image data of dtype {A.dtype} cannot be " - f"converted to float") + if n_input == 1: + if A.dtype != np.uint8 and not np.can_cast(A.dtype, float, "same_kind"): + raise TypeError(f"Image data of dtype {A.dtype} cannot be " + f"converted to float") + else: + for key in A.dtype.fields: + if not np.can_cast(A[key].dtype, float, "same_kind"): + raise TypeError(f"Image data of dtype {A.dtype} cannot be " + f"converted to a sequence of floats") if A.ndim == 3 and A.shape[-1] == 1: A = A.squeeze(-1) # If just (M, N, 1), assume scalar and apply colormap. if not (A.ndim == 2 or A.ndim == 3 and A.shape[-1] in [3, 4]): + if A.ndim == 3 and A.shape[0] == 2: + raise TypeError(f"Invalid shape {A.shape} for image data." + " For multivariate data a valid colormap must be" + " explicitly declared, for example" + f" cmap='BiOrangeBlue' or cmap='2VarAddA'") + if A.ndim == 3 and A.shape[0] > 2 and A.shape[0] <= 8: + raise TypeError(f"Invalid shape {A.shape} for image data." + " For multivariate data a multivariate colormap" + " must be explicitly declared, for example" + f" cmap='{A.shape[0]}VarAddA'") raise TypeError(f"Invalid shape {A.shape} for image data") if A.ndim == 3: # If the input data has values outside the valid range (after @@ -685,7 +702,7 @@ def set_data(self, A): """ if isinstance(A, PIL.Image.Image): A = pil_to_array(A) # Needed e.g. to apply png palette. - self._A = self._normalize_image_array(A) + self._A = self._normalize_image_array(A, self.norm.n_input) self._imcache = None self.stale = True @@ -753,6 +770,12 @@ def set_interpolation_stage(self, s): """ s = mpl._val_or_rc(s, 'image.interpolation_stage') _api.check_in_list(['data', 'rgba', 'auto'], s=s) + if self.norm.n_input > 1: + if s == 'data': + raise ValueError("'rgba' is the only interpolation stage" + " available for multivariate data.") + else: + s = 'rgba' self._interpolation_stage = s self.stale = True diff --git a/lib/matplotlib/streamplot.py b/lib/matplotlib/streamplot.py index ece8bebf8192..725fff7b23fd 100644 --- a/lib/matplotlib/streamplot.py +++ b/lib/matplotlib/streamplot.py @@ -6,7 +6,7 @@ import numpy as np import matplotlib as mpl -from matplotlib import _api, cm, patches +from matplotlib import _api, colorizer, patches import matplotlib.colors as mcolors import matplotlib.collections as mcollections import matplotlib.lines as mlines @@ -228,7 +228,7 @@ def streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, if use_multicolor_lines: if norm is None: norm = mcolors.Normalize(color.min(), color.max()) - cmap = cm._ensure_cmap(cmap) + cmap = colorizer._ensure_cmap(cmap) streamlines = [] arrows = [] diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivar_cmap_from_image.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivar_cmap_from_image.png new file mode 100644 index 0000000000000000000000000000000000000000..a69968132949f40ae3fd9764a354d3e82623c1d1 GIT binary patch literal 5257 zcmeHKc~FyQ8h-;UM^UiS1qFjxTp8DuARr(RBSk?<pDVNB7g%Ah^O0q)Bx|E}X z7q=?~AzX?OUgj0BpBAeex^-vN{0BxGBm*zhp&U#zP+%;wd+xOSm7Aq&Wf+`ort`;RJs~*S#-Yp(T{?r_VjmhD2x`JPj z;@jp)RRj}4hJ)^Fx!8eI#@>PT4Nm*H*1f)e`D^>~M?}SK>WfuQ0gl$Hd{nx%YPkbL zc-Co0wHNQ=ZENMi2IPL7KeJlx8K^|r!}f_coE!6=9%z`gQkwsMmoaZyDDIq^2WkuB zhvq*{L@eZp9hw|pG>`-yFaYE%2guMC@dU*k0O;6Iq3=gzZuT#!=) zV2ADr0I0iQG5~zP_2?D?TL}DbBGB7<#Nndd7jWZv#(rMq=?=Wif9!;rF6wbN8$drwb~9%ZPEb|X#f zl0X|Y8!llQP2W~Rn!XgH;I0gO2R~zN*6#3UF>4eR+S)DMAw7vCd^=6wVOm7l<0_fH z8n&Ko#qx~uT79a8rZmNm2<1T)v}9cL5bFuLCaxo&3txZXk`bQO{w*m5IZ&E~nh^Qx zc^GBddCui>(MVDU-~WL0ma^W3lt*mOF7`|3cE5(hqsU(Hc6aNvkKEGE=cNi=lLn*;W_pw)ODYK+6YPsKinvI0n z+uP^A4ZTnE2z&6_CBeMDh}29#O9GsP7i>kufF~{r2`l_$PCsG!9EqNDzJx3gCHM6u69E+pjtAGLy&-~)}{9geg9@1TNaEa(+y0E zT^vQNsky5JX44xYv-`HF6FEY*BIP1`$yTPh3xdMoCOTU1`H-fCXkOu=O|V}Qg#AR^ zSY`@0ceBJvgpl{PaNblujM0D#Z*1xb=nmPe@jcRrv_`1S>bNxE*W*&I0PwGV$=FR` zRY$GXofF73vQL`_EuP^ju}P)|E_1C^puAz)uq zK9r&kqvGyDkxJ)XqWnzya{NSatA%Dh1Pv;%l$VlyVT2?f#eFo~e=pK=whxmxYl@Zo ztf00slx5LJZ%s`(zRLt_WB~;@qe-o<5Ldx-0wnfVEhr_PlZX^%L-qpWW>Ueq$1(vS@YF6-f!UJ%*?^2D)dl(L#lROI&W$WQu!(2 zU~wgD6FDZkav^vO@gUrNq})`$%ouxhfumuSUGQ^C77urLaNshp-+i%6TneY|RU@yurABg^>4Za9K+O^`HsI(>SMjSO(O3 z!2q!O8M?j8%)G>5sfE#{76z}@2F+I{)&BXZY4nJ=_T@RAlFxAcKrYgKuu6i&Y5T2y zN)izRmD6mfpxNh*0Ir;#tHPKP^jzl)hTa$qVH)n=vB$+2zq>m~eE=2l7)o=HMICSK zj(PM={yNzWrOBt~Iit}@0t`otcSFT6wPNe5$LD76isD0_$mW%rTkc^GOP&7l^=#9$ z3Pip~_{|(hZvAEi0t}ipA`y^>_ATvxd$CZMsEazb(zb#kU382Je$v9Ek9+HTOi3Mo zU}U5c<8i4__%)P$z|GyIrKL4cY=pAQQ50%~tYVO0Q{c=O2>Q6(Al^Y2dnzz6QrFPn zy%~Q}?hlMQ_4cN<-gpN4;TV~Iu-3hI)%6)a6}c~F=TI#a(1t$>UxzNH31bL0n!Nu+ zQ4R?7p~=2xLjNuOG^cHxOvjGtzzsE1Xf&=L$4u0+#+ix1Pjs#&`46GnM)JP*3_+!icYPpy+^WOQY==RR^kHCmK0_U?^b z?K+Te^v#lo&oZT#a9xd%9G>i_ai^Q|-X76Mxc{GTH* bu?{PEH1^xZwSA>fngVvG98Okz;&u6NoXPz> literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_cmap_call.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_cmap_call.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf72bca8115cc918dff8d2625f3a69320dcbc55 GIT binary patch literal 10570 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_cmap_shapes.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_cmap_shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..0bb37e45177242698f517d7f638794fa7ca7f2fe GIT binary patch literal 5073 zcmcIoX;>3i+s36@1xu+dS{1M;pk)<7(@n}FhSTY;th{4S_{4gm!eSGGVnS71gJLh7 zL&cs$!uQ69#-Nd?^A;wD%uLKoLPFy$&CLuE=Aog%mT-$Okd;Y@xtaN4GaEB&qrKs= zu@}&`rlwKs;F$=>jXIlP0ZzuN8TO} z#cuwUJuD4NsN4cExq83lzM6G%K6$YRl+Vb{ z3sL|pqwGpdkEuEv9WRCzvm&aM(^GlQebu~HA3eHRMdh;Yr)z8UgUUKBWwmwh!wt$C z>o&$J8wW05{!CeY^7)%}Dk=|E*4ru@U;aL5{l7IR_FbULMXe)=W+L9`j)lPrqC%k< z>n!MYad)R**{~VT>B*yUOzgRA9LPd*jbFF6m=S9R*Be9lfE7YymM)0j+qJjdJN>(O#D*dS7~PomB+rUi^i zSj5&)8VtB-dj#gh)zP3Nl`B?chJb)l$H(Re)Zorim2Dq^N!OsgxPDaet%HP5^QGb_ z6a~>ie&NzoB;HS!3u&@3#K7Hiw{!Lg9U9@@i-hrtwxJ-?&!X4FF)FBMgp5TC#lonFe+g`9gI8iNLoenaHa+AmmMW!-GS)dR5 zjqh%Fce^SfDWBiMiesFBsGY`S3_ObuT9uHlOxlFLoNeH^liYJMG7wqn?+v>MgAZeqq;{M*?~NT^*E$Z_E2&c(2=1X(1jXHZWb6 zcP|R#J|NPH(td--L{8ufP5tmE1{B>>UA3?W)j&J%A}3^_risDi(Xv;smzJ%UP+rTy zBuQ-o5O(K}r{LT2UY?iqPtpby9-}6m+C50Eggtd2zRiWsyTQq`bn~(&hs4-<$(;6? z=9!_j`C)8|;w~X(2Hx`nYK=iwhwMp6%kc)US8h4%jegiaBU`Qdn-B)z(;J zB(MH?vo_7z1dtJ23?sVuLwUk4PE=7JeKLG!XKES6l6jMm51NETUI!r^ajk!iOWkaed=d*ZdpTjYTfH8QNi`k)hmn$tnBjsd^ZLB!& zl_Q*(;<4Y(cwiBZ?jG{EJ6<%(NH!ENfsQ;Y({jzpXenaO76O#jLWwmtYHu;gyIsi6 zb14CnA7~yM=zhXGNTxGqL!>$)eb&pErfdIMp8FU%HpG}-{!T!2R6COOSlGi?6iO-^ z`na%w1*Z}`%SEr)K^GpEU|CGX2U!(UF)_Bq)Kg?l$4Ws|KZNdL6zgUQZT!IrlLi|N za4rEi8#Aq}6tFg>C?hxv?dw;u6p#l6xYQ~IBKGuMt~<$zOiY<0cj>bd+@Ay( z)T7N9!dKp|X<_rDPp{==^sWODoS#8z1^=M!o?rEI=IYfgM#Y1vURo-{0J_XEx`h zq&&q(L4hoqt_V(Q~@hjfrcDNBUVpp)6O|M^& z+sK{EZV*T;?!ElfaMd?Ts}i)-d=}FrzRGhZjLT>CMNg*VGZDwO&B=b%aZCnHZfuZU zRh|A#HIw=lEzTgej-HpT98ryU!ynS}hdc8_-~2+*3~_|-uW27}F|@_~!QZPI2_F-) zKfAOn-+j8eJ*9insIOnVPB^lz!LZUvn0GJ21M3LK;*HB3bbo%HXjV-1awfw{?Q@{) zr~DC5Ux^i0@Y+XkdY3d%c*5Odsps`25A5UT_q}wG!sc71^xPv^P#F1L87!^-2G@39 z8LIMPz&mdzA&**AwSen8FPX|Nl*F?=A7H@+)fYGaH9`2N_A+!X2XF4xJ@{M@n7iAx zBtJXJsu*{v#PD0(g9^tXX z9fNqt&(T+$gxf2dorH2G5{8FBfPyN}e6F^;|BEwzSS5~)YaiVe4O!-#UfFz?JE~;b zQF&oER8!l%1SPhAJS^Vsmy_`KjPt_7?HU?H_A^u4&6$CXaXiAxbfFdpvBsJUV({ne z#J4Sa^!6~sn)<8bCq;9+7GW`qKWU+EGAAf{%$wnsFq)WOcM-5(1M}g*TnJ?GX2796 zFP#YiaWk7tlbapSn_6mi$8C#8|B^be72QYJ7^|y0)uql)JDuakXjbzZy2r`e?M+JH z-wjT%7eZwNuCVT^pQptVb=a=sIXzt;x}b*kcvFK`*1D`hnpQhuU6l_v@d)D-y`~Fo zspzV`c3A=NwqVkJ z%gc;@suXyzL;Y>2j)n%KD1cLkxb$rqFjG(^*>t+-gHkrME!!ZMS8qflM<9v4vVNwM zkXeaDo7dkLCGiX9m3W6hLXD!_8q{44SPA`_Os?JL-A3msA_qinfcFP-iE7BN%CSc& zd_3d`fH&Fu+Igw1r=?Ib{QXFS z0mslun5<8B5^88@F&KI*F~O}!n17Ot>R${Q8I*s&+b=h*`quO|R=IDk3wIne>cigA zWujCgcjLnDj+y@N);^y;q};^7nFJ54`yjVa;uF5ezS%}Nj#P3jyC7eWRVyX+ElQn6 z9?>b1A%BMqC?K>maV=pq7Zvgi5SQK(3X^;Y{}!&tV$B-7jIqtLKSf=O=K3d_D|r>Y z@W?ZI^pU3$uMFcbKi6P>(K7TM|3B)rR?<3XZ4qhraOtaQ~m8`o*DLC9d=bZ5=lvyuEjmF)e4~ z^oyyHINf4gP*}t}JLBNqqe(xC|lHwvH~YE_8GFbyyCvT zb)M0@G2HiWI=258x|hz)=evaPfEUDk#t0xy(C!)ma=@KZAzLyBU5izyOLE;v0C?Xr z?JLEbuH;@?U;_q`fd9XK!vQ%R6GLR0qI9oV>;#DT?t$xV4U=Yjj{8c%zh?B7%JCOC zmC8|(A%`P@(T#%O7(D;7;-$fJ5rE@^RvAsEpUYNGPAuUqI{p;)d?W>N)SLgw?LmPc z76NgxckmWFsCwQyv^=-C#s8(JRwvEvu$^yu5$+Tqeuyztb&?}AzwIP}5BsJk>*SSU z6vN6ruMA7CEUz|j+Kb2(AgdG5PGqbgiSG0k2@!Zd1|MteTK!U;sI6##C2D7KuM4#< zovY$w!_>RmDsX|y=hDeY*!0j=Av1Y)nv(3eK+?%`m-??~^mH3x6mOuGIBHj}8pBv$ zNKDyzzl;{@>SElAB^m=_bIB|-tQv#M24$0o7#yhK92QYc0b%E|DJci=Zn}YIrmroZ z9hauH`J}bJGOXS&AAJg_G8+33ZMk##m3U?T!=KzcAX*&uy!EM$!*kr?aHWCxfKg}e z`va4Y1fXJ8*G;0i!}s}Lp{E}GNbKVj=ADkH_A?Im->j~khLwuiB*KM9G#XeO6K=s| zGNa$VxH43aMwI&3nuueRDU+FgBlH(RUa!c$VQs(XTkN*~u2_nbd;aVqKJs_|V+o?S b_;o=;8;m5Xt|yf*R&hGv1}XpU?A8APX1yCQ literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_masked_data.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_masked_data.png new file mode 100644 index 0000000000000000000000000000000000000000..7abfe8e5ef6b102f37a07a62eced3b6fb4965cd3 GIT binary patch literal 15397 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_visualizations.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_visualizations.png new file mode 100644 index 0000000000000000000000000000000000000000..4b26c18c54c103ab9fe1a16921d2a91d09826d3c GIT binary patch literal 10840 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 ZO5a?)h==5CfMww+$g0YeJ~w&yzX1OHORN9@ literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivar_cmap_call.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivar_cmap_call.png new file mode 100644 index 0000000000000000000000000000000000000000..89599461c3e684466068ad2b8f1819c5f1ee56ef GIT binary patch literal 10318 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 h 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 U44?Ph6C8nts?OcAI}e}#7w+it6aWAK literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_figimage.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_figimage.png new file mode 100644 index 0000000000000000000000000000000000000000..934414cde061014f47593fb556c0a56710d95839 GIT binary patch literal 86640 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

Rq+W?dWUr(C|kuK9Cv)QFR!}#oW5@n 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ƽJi}_k|${-iM2Y-|R)h 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_imshow_complex_data.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_imshow_complex_data.png new file mode 100644 index 0000000000000000000000000000000000000000..f47f17653c18b691b1a5291e6531644eb7e4a8e7 GIT binary patch literal 2538 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 Ge)@MPGyT^9 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_pcolormesh_norm.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_pcolormesh_norm.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e6fb277e0d832619e69d7a9cdf97d0a9a34b71 GIT binary patch literal 10588 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 3, x_0) + + fig, axes = plt.subplots(1, 4, figsize=(8, 2)) + axes[0].imshow(x_0, interpolation_stage='rgba') + # one of two arrays masked + axes[1].imshow((x_0, x_1), cmap='BiPeak', interpolation_stage='rgba') + # a single masked array + x = np.ma.array((x_0, x_1)) + axes[2].imshow(x, cmap='BiPeak', interpolation_stage='rgba') + # a single masked array with a complex dtype + m = np.ma.zeros((5, 5), dtype='complex128') + m.real[:, :] = x_0 + m.imag[:, :] = x_1 + m.mask = x_0.mask + axes[3].imshow(m, cmap='BiPeak', interpolation='nearest') + + remove_ticks_and_titles(fig) + + +def test_bivariate_inconsistent_shape(): + x_0 = np.arange(25, dtype='float32').reshape(5, 5) % 5 + x_1 = np.arange(30, dtype='float32').reshape(6, 5).T % 5 + + fig, ax = plt.subplots(1) + with pytest.raises(ValueError, match="For multivariate data all"): + ax.imshow((x_0, x_1), interpolation='nearest', cmap='BiPeak') + + +@image_comparison(["bivariate_cmap_shapes.png"]) +def test_bivariate_cmap_shapes(): + x_0 = np.arange(100, dtype='float32').reshape(10, 10) % 10 + x_1 = np.arange(100, dtype='float32').reshape(10, 10).T % 10 + + fig, axes = plt.subplots(1, 4, figsize=(10, 2)) + + # shape = square + axes[0].imshow((x_0, x_1), cmap='BiPeak', vmin=1, vmax=8, interpolation='nearest') + # shape = cone + axes[1].imshow((x_0, x_1), cmap='BiCone', vmin=0.5, vmax=8.5, + interpolation='nearest') + + # shape = ignore + cmap = mpl.bivar_colormaps['BiCone'] + cmap = cmap.with_extremes(shape='ignore') + axes[2].imshow((x_0, x_1), cmap=cmap, vmin=1, vmax=8, interpolation='nearest') + + # shape = circleignore + cmap = mpl.bivar_colormaps['BiCone'] + cmap = cmap.with_extremes(shape='circleignore') + axes[3].imshow((x_0, x_1), cmap=cmap, vmin=0.5, vmax=8.5, interpolation='nearest') + remove_ticks_and_titles(fig) + + +@image_comparison(["multivariate_figimage.png"]) +def test_multivariate_figimage(): + fig = plt.figure(figsize=(2, 2), dpi=100) + x, y = np.ix_(np.arange(100) / 100.0, np.arange(100) / 100) + z = np.sin(x**2 + y**2 - x*y) + c = np.sin(20*x**2 + 50*y**2) + img = np.stack((z, c)) + + fig.figimage(img, xo=0, yo=0, origin='lower', cmap='BiPeak') + fig.figimage(img[:, ::-1, :], xo=0, yo=100, origin='lower', cmap='BiPeak') + fig.figimage(img[:, :, ::-1], xo=100, yo=0, origin='lower', cmap='BiPeak') + fig.figimage(img[:, ::-1, ::-1], xo=100, yo=100, origin='lower', cmap='BiPeak') + + +@image_comparison(["multivar_cmap_call.png"]) +def test_multivar_cmap_call(): + """ + This evaluates manual calls to a bivariate colormap + The figure exists because implementing an image comparison + is easier than anumeraical comparisons for mulitdimensional arrays + """ + x_0 = np.arange(100, dtype='float32').reshape(10, 10) % 10 + x_1 = np.arange(100, dtype='float32').reshape(10, 10).T % 10 + + fig, axes = plt.subplots(1, 5, figsize=(10, 2)) + + cmap = mpl.multivar_colormaps['2VarAddA'] + + # call with 0D + axes[0].scatter(3, 6, c=[cmap((0.5, 0.5))]) + + # call with 1D + im = cmap((x_0[0]/9, x_1[::-1, 0]/9)) + axes[0].scatter(np.arange(10), np.arange(10), c=im) + + # call with 2D + cmap = mpl.multivar_colormaps['2VarSubA'] + im = cmap((x_0/9, x_1/9)) + axes[1].imshow(im, interpolation='nearest') + + # call with 3D array + im = cmap(((x_0/9, x_0/9), + (x_1/9, x_1/9))) + axes[2].imshow(im.reshape((20, 10, 4)), interpolation='nearest') + + # call with constant alpha, and data of type int + im = cmap((x_0.astype('int')*25, x_1.astype('int')*25), alpha=0.5) + axes[3].imshow(im, interpolation='nearest') + + # call with variable alpha + im = cmap((x_0/9, x_1/9), alpha=(x_0/9)**2, bytes=True) + axes[4].imshow(im, interpolation='nearest') + + # call with wrong shape + with pytest.raises(ValueError, match="must have a first dimension 2"): + cmap((0, 0, 0)) + + # call with wrong shape of alpha + with pytest.raises(ValueError, match=r"shape \(2,\) does not match " + r"that of X\[0\] \(\)"): + cmap((0, 0), alpha=(1, 1)) + remove_ticks_and_titles(fig) + + +def test_multivar_set_array(): + # compliments test_collections.test_collection_set_array() + vals = np.arange(24).reshape((2, 3, 4)) + c = mpl.collections.Collection(cmap="BiOrangeBlue") + + c.set_array(vals) + vals = np.empty((2, 3, 4), dtype='object') + with pytest.raises(TypeError, match="^Image data of dtype"): + # Test set_array with wrong dtype + c.set_array(vals) + + +def test_correct_error_on_multivar_colormap_in_streamplot(): + w = 3 + Y, X = np.mgrid[-w:w:100j, -w:w:100j] + U = -1 - X**2 + Y + V = 1 + X - Y**2 + speed = np.sqrt(U**2 + V**2) + + fig, ax = plt.subplots(1, 1) + # Varying color along a streamline + strm = ax.streamplot(X, Y, U, V, color=U, linewidth=2) + with pytest.raises(ValueError, match=r"'BiOrangeBlue' is not a "): + strm = ax.streamplot(X, Y, U, V, color=U, linewidth=2, cmap='BiOrangeBlue') + + +def test_multivar_cmap_call_tuple(): + cmap = mpl.multivar_colormaps['2VarAddA'] + assert_array_equal(cmap((0.0, 0.0)), (0, 0, 0, 1)) + assert_array_equal(cmap((1.0, 1.0)), (1, 1, 1, 1)) + assert_allclose(cmap((0.0, 0.0), alpha=0.1), (0, 0, 0, 0.1), atol=0.1) + + cmap = mpl.multivar_colormaps['2VarSubA'] + assert_array_equal(cmap((0.0, 0.0)), (1, 1, 1, 1)) + assert_allclose(cmap((1.0, 1.0)), (0, 0, 0, 1), atol=0.1) + + +@image_comparison(["bivariate_cmap_call.png"]) +def test_bivariate_cmap_call(): + """ + This evaluates manual calls to a bivariate colormap + The figure exists because implementing an image comparison + is easier than anumeraical comparisons for mulitdimensional arrays + """ + x_0 = np.arange(100, dtype='float32').reshape(10, 10) % 10 + x_1 = np.arange(100, dtype='float32').reshape(10, 10).T % 10 + + fig, axes = plt.subplots(1, 5, figsize=(10, 2)) + + cmap = mpl.bivar_colormaps['BiCone'] + + # call with 1D + im = cmap((x_0[0]/9, x_1[::-1, 0]/9)) + axes[0].scatter(np.arange(10), np.arange(10), c=im) + + # call with 2D + im = cmap((x_0/9, x_1/9)) + axes[1].imshow(im, interpolation='nearest') + + # call with 3D array + im = cmap(((x_0/9, x_0/9), + (x_1/9, x_1/9))) + axes[2].imshow(im.reshape((20, 10, 4)), interpolation='nearest') + + cmap = mpl.bivar_colormaps['BiOrangeBlue'] + # call with constant alpha, and data of type int + im = cmap((x_0.astype('int')*25, x_1.astype('int')*25), alpha=0.5) + axes[3].imshow(im, interpolation='nearest') + + # call with variable alpha + im = cmap((x_0/9, x_1/9), alpha=(x_0/9)**2, bytes=True) + axes[4].imshow(im, interpolation='nearest') + + # call with wrong shape + with pytest.raises(ValueError, match="must have a first dimension 2"): + cmap((0, 0, 0)) + + # call with wrong shape of alpha + with pytest.raises(ValueError, match=r"shape \(2,\) does not match " + r"that of X\[0\] \(\)"): + cmap((0, 0), alpha=(1, 1)) + + remove_ticks_and_titles(fig) + + +def test_bivar_cmap_call_tuple(): + cmap = mpl.bivar_colormaps['BiOrangeBlue'] + assert_allclose(cmap((1.0, 1.0)), (1, 1, 1, 1), atol=0.01) + assert_allclose(cmap((0.0, 0.0)), (0, 0, 0, 1), atol=0.1) + assert_allclose(cmap((0.0, 0.0), alpha=0.1), (0, 0, 0, 0.1), atol=0.1) + + +@image_comparison(["bivar_cmap_from_image.png"]) +def test_bivar_cmap_from_image(): + """ + This tests the creation and use of a bivariate colormap + generated from an image + """ + # create bivariate colormap + im = np.ones((10, 12, 4)) + im[:, :, 0] = np.arange(10)[:, np.newaxis]/10 + im[:, :, 1] = np.arange(12)[np.newaxis, :]/12 + fig, axes = plt.subplots(1, 2) + axes[0].imshow(im, interpolation='nearest') + + # use bivariate colormap + data_0 = np.arange(12).reshape((3, 4)) + data_1 = np.arange(12).reshape((4, 3)).T + cmap = mpl.colors.BivarColormapFromImage(im) + axes[1].imshow((data_0, data_1), cmap=cmap, + interpolation='nearest') + + remove_ticks_and_titles(fig) + + +def test_wrong_multivar_clim_shape(): + fig, ax = plt.subplots() + im = np.arange(24).reshape((2, 3, 4)) + with pytest.raises(ValueError, match="Invalid vmin for `MultiNorm` with"): + ax.imshow(im, cmap='BiPeak', vmin=(None, None, None)) + with pytest.raises(ValueError, match="Invalid vmax for `MultiNorm` with"): + ax.imshow(im, cmap='BiPeak', vmax=(None, None, None)) + + +def test_wrong_multivar_norm_shape(): + fig, ax = plt.subplots() + im = np.arange(24).reshape((2, 3, 4)) + with pytest.raises(ValueError, match="for multivariate colormap with 2"): + ax.imshow(im, cmap='BiPeak', norm=(None, None, None)) + + +def test_wrong_multivar_data_shape(): + fig, ax = plt.subplots() + im = np.arange(12).reshape((1, 3, 4)) + with pytest.raises(ValueError, match="The data must contain complex numbers, or"): + ax.imshow(im, cmap='BiPeak') + im = np.arange(12).reshape((3, 4)) + with pytest.raises(ValueError, match="The data must contain complex numbers, or"): + ax.imshow(im, cmap='BiPeak') + + +def test_missing_multivar_cmap_imshow(): + fig, ax = plt.subplots() + im = np.arange(200).reshape((2, 10, 10)) + with pytest.raises(TypeError, + match=("a valid colormap must be explicitly declared" + + ", for example cmap='BiOrangeBlue'")): + ax.imshow(im) + im = np.arange(300).reshape((3, 10, 10)) + with pytest.raises(TypeError, + match=("multivariate colormap must be explicitly declared" + + ", for example cmap='3VarAddA")): + ax.imshow(im) + im = np.arange(1000).reshape((10, 10, 10)) + with pytest.raises(TypeError, + match=re.escape("Invalid shape (10, 10, 10) for image data")): + ax.imshow(im) + + +def test_setting_A_on_ColorizingArtist(): + # correct use + vm = mpl.colorizer.ColorizingArtist(mpl.colorizer.Colorizer(cmap='3VarAddA')) + data = np.arange(3*25).reshape((3, 5, 5)) + vm.set_array(data) + + # attempting to set wrong shape of data + with pytest.raises(ValueError, match=re.escape( + " must have a first dimension 3 or be of" + )): + data = np.arange(2*25).reshape((2, 5, 5)) + vm.set_array(data) + + +def test_setting_cmap_on_Colorizer(): + # correct use + colorizer = mpl.colorizer.Colorizer(cmap='BiOrangeBlue') + colorizer.cmap = 'BiPeak' + # incorrect use + with pytest.raises(ValueError, match=re.escape( + "The colormap viridis does not support 2" + )): + colorizer.cmap = 'viridis' + # incorrect use + colorizer = mpl.colorizer.Colorizer() + with pytest.raises(ValueError, match=re.escape( + "The colormap BiOrangeBlue does not support 1" + )): + colorizer.cmap = 'BiOrangeBlue' + + +def test_setting_norm_on_Colorizer(): + # correct use + vm = mpl.colorizer.Colorizer(cmap='3VarAddA') + vm.norm = 'linear' + vm.norm = ['linear', 'log', 'asinh'] + vm.norm = (None, None, None) + + # attempting to set wrong shape of norm + with pytest.raises(ValueError, match=re.escape( + "Invalid norm for multivariate colormap with 3 inputs." + )): + vm.norm = (None, None) + + +def test_setting_clim_on_ScalarMappable(): + # correct use + vm = mpl.colorizer.Colorizer(cmap='3VarAddA') + vm.set_clim(0, 1) + vm.set_clim([0, 0, 0], [1, 2, 3]) + # attempting to set wrong shape of vmin/vmax + with pytest.raises(ValueError, match=re.escape( + "Invalid vmin for `MultiNorm` with 3 inputs")): + vm.set_clim(vmin=[0, 0]) + + +def test_bivar_eq(): + """ + Tests equality between bivariate colormaps + """ + cmap_0 = mpl.bivar_colormaps['BiOrangeBlue'] + + cmap_1 = mpl.bivar_colormaps['BiOrangeBlue'] + assert (cmap_0 == cmap_1) is True + + cmap_1 = mpl.multivar_colormaps['2VarAddA'] + assert (cmap_0 == cmap_1) is False + + cmap_1 = mpl.bivar_colormaps['BiPeak'] + assert (cmap_0 == cmap_1) is False + + cmap_1 = mpl.bivar_colormaps['BiOrangeBlue'] + cmap_1 = cmap_1.with_extremes(bad='k') + assert (cmap_0 == cmap_1) is False + + cmap_1 = mpl.bivar_colormaps['BiOrangeBlue'] + cmap_1 = cmap_1.with_extremes(outside='k') + assert (cmap_0 == cmap_1) is False + + cmap_1 = mpl.bivar_colormaps['BiOrangeBlue'] + cmap_1 = cmap_1.with_extremes(shape='circle') + assert (cmap_0 == cmap_1) is False + + +def test_cmap_error(): + data = np.ones((2, 4, 4)) + for call in (plt.imshow, plt.pcolor, plt.pcolormesh): + with pytest.raises(ValueError, match=re.escape( + "See matplotlib.bivar_colormaps() and matplotlib.multivar_colormaps()" + " for bivariate and multivariate colormaps." + )): + call(data, cmap='not_a_cmap') + + with pytest.raises(ValueError, match=re.escape( + "See matplotlib.bivar_colormaps() and matplotlib.multivar_colormaps()" + " for bivariate and multivariate colormaps." + )): + mpl.collections.PatchCollection([], cmap='not_a_cmap') + +if 0: + def test_artist_format_cursor_data_multivar(): + + X = np.zeros((3, 3)) + X[0, 0] = 0.9 + X[0, 1] = 0.99 + X[0, 2] = 0.999 + X[1, 0] = -1 + X[1, 1] = 0 + X[1, 2] = 1 + X[2, 0] = 0.09 + X[2, 1] = 0.009 + X[2, 2] = 0.0009 + + labels_list = [ + "[0.9, 0.0]", + "[1., 0.0]", + "[1., 0.0]", + "[-1.0, 0.0]", + "[0.0, 0.0]", + "[1.0, 0.0]", + "[0.09, 0.0]", + "[0.009, 0.0]", + "[0.0009, 0.0]", + ] + + pos = [[0, 0], [1, 0], [2, 0], + [0, 1], [1, 1], [2, 1], + [0, 2], [1, 2], [2, 2]] + + from matplotlib.backend_bases import MouseEvent + + for cmap in ['BiOrangeBlue', '2VarAddA']: + fig, ax = plt.subplots() + norm = mpl.colors.BoundaryNorm(np.linspace(-1, 1, 20), 256) + data = (X, np.zeros(X.shape)) + im = ax.imshow(data, cmap=cmap, norm=(norm, None)) + + for v, text in zip(pos, labels_list): + xdisp, ydisp = ax.transData.transform(v) + event = MouseEvent('motion_notify_event', fig.canvas, xdisp, ydisp) + assert im.format_cursor_data(im.get_cursor_data(event)) == text + + +def test_multivariate_safe_masked_invalid(): + from matplotlib import cbook + dt = np.dtype('float32, float32').newbyteorder('>') + x = np.zeros(2, dtype=dt) + x['f0'][0] = np.nan + xm = cbook.safe_masked_invalid(x) + assert (xm['f0'].mask == (True, False)).all() + assert (xm['f1'].mask == (False, False)).all() + assert ' Date: Mon, 6 Jan 2025 09:44:04 +0100 Subject: [PATCH 03/12] docstrings for multivariate plotting in imshow, pcolor and pcolormesh --- doc/api/colors_api.rst | 1 + lib/matplotlib/axes/_axes.py | 35 ++++++++++++++++++---------------- lib/matplotlib/colorizer.py | 37 ++++++++++++++++++++++++++++++++++++ lib/matplotlib/colors.py | 16 ++++++++-------- 4 files changed, 65 insertions(+), 24 deletions(-) diff --git a/doc/api/colors_api.rst b/doc/api/colors_api.rst index 6b02f723d74d..3022512dd371 100644 --- a/doc/api/colors_api.rst +++ b/doc/api/colors_api.rst @@ -53,6 +53,7 @@ Multivariate Colormaps BivarColormap SegmentedBivarColormap BivarColormapFromImage + MultivarColormap Other classes ------------- diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 3f979f532c6f..18ae2bd97a5f 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5685,7 +5685,7 @@ def imshow(self, X, cmap=None, norm=None, *, aspect=None, """ Display data as an image, i.e., on a 2D regular raster. - The input may either be actual RGB(A) data, or 2D scalar data, which + The input may either be actual RGB(A) data, or 2D data, which will be rendered as a pseudocolor image. For displaying a grayscale image, set up the colormapping using the parameters ``cmap='gray', vmin=0, vmax=255``. @@ -5706,24 +5706,25 @@ def imshow(self, X, cmap=None, norm=None, *, aspect=None, - (M, N): an image with scalar data. The values are mapped to colors using normalization and a colormap. See parameters *norm*, *cmap*, *vmin*, *vmax*. + - (K, M, N): multiple images with scalar data. Must be used + with a multivariate or bivariate colormap. See *cmap*. - (M, N, 3): an image with RGB values (0-1 float or 0-255 int). - (M, N, 4): an image with RGBA values (0-1 float or 0-255 int), i.e. including transparency. - The first two dimensions (M, N) define the rows and columns of - the image. + Here M and N define the rows and columns of the image. Out-of-range RGB(A) values are clipped. - %(cmap_doc)s + %(multi_cmap_doc)s This parameter is ignored if *X* is RGB(A). - %(norm_doc)s + %(multi_norm_doc)s This parameter is ignored if *X* is RGB(A). - %(vmin_vmax_doc)s + %(multi_vmin_vmax_doc)s This parameter is ignored if *X* is RGB(A). @@ -6062,9 +6063,10 @@ def pcolor(self, *args, shading=None, alpha=None, norm=None, cmap=None, Parameters ---------- - C : 2D array-like + C : 2D array-like or list of 2D array-like objects The color-mapped values. Color-mapping is controlled by *cmap*, - *norm*, *vmin*, and *vmax*. + *norm*, *vmin*, and *vmax*. Multiple arrays are only supported + when a bivariate or mulivariate colormap is used, see *cmap*. X, Y : array-like, optional The coordinates of the corners of quadrilaterals of a pcolormesh:: @@ -6111,11 +6113,11 @@ def pcolor(self, *args, shading=None, alpha=None, norm=None, cmap=None, See :doc:`/gallery/images_contours_and_fields/pcolormesh_grids` for more description. - %(cmap_doc)s + %(multi_cmap_doc)s - %(norm_doc)s + %(multi_norm_doc)s - %(vmin_vmax_doc)s + %(multi_vmin_vmax_doc)s %(colorizer_doc)s @@ -6280,12 +6282,13 @@ def pcolormesh(self, *args, alpha=None, norm=None, cmap=None, vmin=None, - (M, N) or M*N: a mesh with scalar data. The values are mapped to colors using normalization and a colormap. See parameters *norm*, *cmap*, *vmin*, *vmax*. + - (K, M, N): multiple images with scalar data. Must be used with + a multivariate or bivariate colormap. See *cmap*. - (M, N, 3): an image with RGB values (0-1 float or 0-255 int). - (M, N, 4): an image with RGBA values (0-1 float or 0-255 int), i.e. including transparency. - The first two dimensions (M, N) define the rows and columns of - the mesh data. + Here M and N define the rows and columns of the image. X, Y : array-like, optional The coordinates of the corners of quadrilaterals of a pcolormesh:: @@ -6316,11 +6319,11 @@ def pcolormesh(self, *args, alpha=None, norm=None, cmap=None, vmin=None, expanded as needed into the appropriate 2D arrays, making a rectangular grid. - %(cmap_doc)s + %(multi_cmap_doc)s - %(norm_doc)s + %(multi_norm_doc)s - %(vmin_vmax_doc)s + %(multi_vmin_vmax_doc)s %(colorizer_doc)s diff --git a/lib/matplotlib/colorizer.py b/lib/matplotlib/colorizer.py index 3fa9e1394863..735417374117 100644 --- a/lib/matplotlib/colorizer.py +++ b/lib/matplotlib/colorizer.py @@ -620,6 +620,15 @@ def _get_colorizer(cmap, norm, colorizer): cmap : str or `~matplotlib.colors.Colormap`, default: :rc:`image.cmap` The Colormap instance or registered colormap name used to map scalar data to colors.""", + multi_cmap_doc="""\ +cmap : str, `~matplotlib.colors.Colormap`, `~matplotlib.colors.BivarColormap`\ + or `~matplotlib.colors.MultivarColormap`, default: :rc:`image.cmap` + The Colormap instance or registered colormap name used to map + scalar/multivariate data to colors. + + Multivariate data is only accepted if a multivariate colormap + (`~matplotlib.colors.BivarColormap` or `~matplotlib.colors.MultivarColormap`) + is used.""", norm_doc="""\ norm : str or `~matplotlib.colors.Normalize`, optional The normalization method used to scale scalar data to the [0, 1] range @@ -634,6 +643,23 @@ def _get_colorizer(cmap, norm, colorizer): list of available scales, call `matplotlib.scale.get_scale_names()`. In that case, a suitable `.Normalize` subclass is dynamically generated and instantiated.""", + multi_norm_doc="""\ +norm : str, `~matplotlib.colors.Normalize` or list, optional + The normalization method used to scale data to the [0, 1] range + before mapping to colors using *cmap*. By default, a linear scaling is + used, mapping the lowest value to 0 and the highest to 1. + + If given, this can be one of the following: + + - An instance of `.Normalize` or one of its subclasses + (see :ref:`colormapnorms`). + - A scale name, i.e. one of "linear", "log", "symlog", "logit", etc. For a + list of available scales, call `matplotlib.scale.get_scale_names()`. + In that case, a suitable `.Normalize` subclass is dynamically generated + and instantiated. + - A list of scale names or `.Normalize` objects matching the number of + variates in the colormap, for use with `~matplotlib.colors.BivarColormap` + or `~matplotlib.colors.MultivarColormap`, i.e. ``["linear", "log"]``.""", vmin_vmax_doc="""\ vmin, vmax : float, optional When using scalar data and no explicit *norm*, *vmin* and *vmax* define @@ -641,6 +667,17 @@ def _get_colorizer(cmap, norm, colorizer): the complete value range of the supplied data. It is an error to use *vmin*/*vmax* when a *norm* instance is given (but using a `str` *norm* name together with *vmin*/*vmax* is acceptable).""", + multi_vmin_vmax_doc="""\ +vmin, vmax : float or list, optional + When using scalar data and no explicit *norm*, *vmin* and *vmax* define + the data range that the colormap covers. By default, the colormap covers + the complete value range of the supplied data. It is an error to use + *vmin*/*vmax* when a *norm* instance is given (but using a `str` *norm* + name together with *vmin*/*vmax* is acceptable). + + A list can be used to define independent limits for each variate when + using a `~matplotlib.colors.BivarColormap` or + `~matplotlib.colors.MultivarColormap`.""", ) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 46469f0b25a2..e5451a20cdeb 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1420,10 +1420,10 @@ def __init__(self, colormaps, combination_mode, name='multivariate colormap'): combination_mode: str, 'sRGB_add' or 'sRGB_sub' Describe how colormaps are combined in sRGB space - - If 'sRGB_add' -> Mixing produces brighter colors - `sRGB = sum(colors)` - - If 'sRGB_sub' -> Mixing produces darker colors - `sRGB = 1 - sum(1 - colors)` + - If 'sRGB_add': Mixing produces brighter colors + ``sRGB = sum(colors)`` + - If 'sRGB_sub': Mixing produces darker colors + ``sRGB = 1 - sum(1 - colors)`` name : str, optional The name of the colormap family. """ @@ -1598,12 +1598,12 @@ def with_extremes(self, *, bad=None, under=None, over=None): bad: :mpltype:`color`, default: None If Matplotlib color, the bad value is set accordingly in the copy - under tuple of :mpltype:`color`, default: None - If tuple, the `under` value of each component is set with the values + under: tuple of :mpltype:`color`, default: None + If tuple, the ``under`` value of each component is set with the values from the tuple. - over tuple of :mpltype:`color`, default: None - If tuple, the `over` value of each component is set with the values + over: tuple of :mpltype:`color`, default: None + If tuple, the ``over`` value of each component is set with the values from the tuple. Returns From 65f41c00dfda0302dbc4448006b86bc98f0e4a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trygve=20Magnus=20R=C3=A6der?= Date: Mon, 6 Jan 2025 13:44:27 +0100 Subject: [PATCH 04/12] Additional tests for colors.MultiNorm --- lib/matplotlib/colors.py | 8 +++--- lib/matplotlib/tests/test_colors.py | 41 +++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index e5451a20cdeb..b8de3514e971 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -3379,7 +3379,7 @@ def __call__(self, value, clip=None): clip = self.clip else: if not np.iterable(clip): - value = [value]*self.n_input + clip = [clip]*self.n_input value = self._iterable_variates_in_data(value, self.n_input) result = [n(v, clip=c) for n, v, c in zip(self.norms, value, clip)] @@ -3408,8 +3408,10 @@ def autoscale(self, A): with self.callbacks.blocked(): # Pause callbacks while we are updating so we only get # a single update signal at the end - self.vmin = self.vmax = None - self.autoscale_None(A) + A = self._iterable_variates_in_data(A, self.n_input) + for n, a in zip(self.norms, A): + n.autoscale(a) + self._changed() def autoscale_None(self, A): """ diff --git a/lib/matplotlib/tests/test_colors.py b/lib/matplotlib/tests/test_colors.py index 8d0f3467f045..4c295a557ccc 100644 --- a/lib/matplotlib/tests/test_colors.py +++ b/lib/matplotlib/tests/test_colors.py @@ -1828,3 +1828,44 @@ def test_LinearSegmentedColormap_from_list_value_color_tuple(): cmap([value for value, _ in value_color_tuples]), to_rgba_array([color for _, color in value_color_tuples]), ) + + +def test_multi_norm(): + # tests for mcolors.MultiNorm + + # test wrong input + with pytest.raises(ValueError, + match="A MultiNorm must be assigned multiple norms"): + mcolors.MultiNorm("bad_norm_name") + with pytest.raises(ValueError, + match="Invalid norm str name"): + mcolors.MultiNorm(["bad_norm_name"]) + + # test get vmin, vmax + norm = mpl.colors.MultiNorm(['linear', 'log']) + norm.vmin = 1 + norm.vmax = 2 + assert norm.vmin[0] == 1 + assert norm.vmin[1] == 1 + assert norm.vmax[0] == 2 + assert norm.vmax[1] == 2 + + # test call with clip + assert_array_equal(norm([3, 3], clip=False), [2.0, 1.584962500721156]) + assert_array_equal(norm([3, 3], clip=True), [1.0, 1.0]) + assert_array_equal(norm([3, 3], clip=[True, False]), [1.0, 1.584962500721156]) + norm.clip = False + assert_array_equal(norm([3, 3]), [2.0, 1.584962500721156]) + norm.clip = True + assert_array_equal(norm([3, 3]), [1.0, 1.0]) + norm.clip = [True, False] + assert_array_equal(norm([3, 3]), [1.0, 1.584962500721156]) + norm.clip = True + + # test inverse + assert_array_almost_equal(norm.inverse([0.5, 0.5849625007211562]), [1.5, 1.5]) + + # test autoscale + norm.autoscale([[0, 1, 2, 3], [0.1, 1, 2, 3]]) + assert_array_equal(norm.vmin, [0, 0.1]) + assert_array_equal(norm.vmax, [3, 3]) From 5bab105e70779edc19beeec744b589b4e670f265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trygve=20Magnus=20R=C3=A6der?= Date: Mon, 3 Feb 2025 21:03:04 +0100 Subject: [PATCH 05/12] Incorporating feedback from @story645 --- lib/matplotlib/axes/_axes.py | 27 +++++--- lib/matplotlib/colorizer.py | 10 +-- lib/matplotlib/colors.py | 13 +--- lib/matplotlib/scale.py | 29 +++++++++ .../bivariate_visualizations.png | Bin 10840 -> 11375 bytes .../multivariate_visualizations.png | Bin 10737 -> 11220 bytes .../tests/test_multivariate_axes.py | 59 +++--------------- 7 files changed, 61 insertions(+), 77 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index 18ae2bd97a5f..bc79f6ab48ba 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -5707,12 +5707,12 @@ def imshow(self, X, cmap=None, norm=None, *, aspect=None, colors using normalization and a colormap. See parameters *norm*, *cmap*, *vmin*, *vmax*. - (K, M, N): multiple images with scalar data. Must be used - with a multivariate or bivariate colormap. See *cmap*. + with a multivariate or bivariate colormap that supports K channels. - (M, N, 3): an image with RGB values (0-1 float or 0-255 int). - (M, N, 4): an image with RGBA values (0-1 float or 0-255 int), i.e. including transparency. - Here M and N define the rows and columns of the image. + The dimensions M and N are the number of rows and columns of the image. Out-of-range RGB(A) values are clipped. @@ -6200,12 +6200,17 @@ def pcolor(self, *args, shading=None, alpha=None, norm=None, cmap=None, # we need to get the colorizer object to know the number of # n_variates that should exist in the array, we therefore get the # colorizer here. - colorizer = mcolorizer.ColorizingArtist._get_colorizer(norm=norm, - cmap=cmap, - colorizer=colorizer) - if colorizer.norm.n_input > 1: - data = mcolorizer._ensure_multivariate_data(colorizer.norm.n_input, args[0]) - args = (data, *args[1:]) + colorizer_obj = mcolorizer.ColorizingArtist._get_colorizer(norm=norm, + cmap=cmap, + colorizer=colorizer) + if colorizer_obj.norm.n_input > 1: + # Valid call signatures for pcolor are with args = (C) or args = (X, Y, C) + # If provided, _pcolorargs will check that X, Y and C have the same shape. + # Before this check, we need to convert C from shape (K, N, M), where K is + # the number of variates, to (N, M) with a data type with K fields. + data = mcolorizer._ensure_multivariate_data(colorizer_obj.norm.n_input, + args[-1]) + args = (*args[:-1], data) X, Y, C, shading = self._pcolorargs('pcolor', *args, shading=shading, kwargs=kwargs) @@ -6243,7 +6248,7 @@ def pcolor(self, *args, shading=None, alpha=None, norm=None, cmap=None, coords = stack([X, Y], axis=-1) collection = mcoll.PolyQuadMesh( - coords, array=C, colorizer=colorizer, + coords, array=C, colorizer=colorizer_obj, alpha=alpha, **kwargs) collection._scale_norm(norm, vmin, vmax) @@ -6456,6 +6461,10 @@ def pcolormesh(self, *args, alpha=None, norm=None, cmap=None, vmin=None, cmap=cmap, colorizer=colorizer) if colorizer_obj.norm.n_input > 1: + # Valid call signatures for pcolor are with args = (C) or args = (X, Y, C) + # If provided, _pcolorargs will check that X, Y and C have the same shape. + # Before this check, we need to convert C from shape (K, N, M), where K is + # the number of variates, to (N, M) with a data type with K fields. data = mcolorizer._ensure_multivariate_data(colorizer_obj.norm.n_input, args[-1]) args = (*args[:-1], data) diff --git a/lib/matplotlib/colorizer.py b/lib/matplotlib/colorizer.py index 735417374117..ca4473d4fa8c 100644 --- a/lib/matplotlib/colorizer.py +++ b/lib/matplotlib/colorizer.py @@ -226,7 +226,7 @@ def _set_cmap(self, cmap): if self.norm.n_output != cmap_obj.n_variates: raise ValueError(f"The colormap {cmap} does not support " f"{self.norm.n_output} variates as required by " - "the norm on this Colorizer.") + f"the {type(self.norm)} on this Colorizer.") self._cmap = cmap_obj if not in_init: self.changed() # Things are not set up properly yet. @@ -751,13 +751,7 @@ def _ensure_norm(norm, n_variates=1): if norm is None: norm = colors.Normalize() elif isinstance(norm, str): - try: - scale_cls = scale._scale_mapping[norm] - except KeyError: - raise ValueError( - "Invalid norm str name; the following values are " - f"supported: {', '.join(scale._scale_mapping)}" - ) from None + scale_cls = scale._get_scale_cls_from_str(norm) norm = _auto_norm_from_scale(scale_cls)() return norm else: # n_variates > 1 diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index b8de3514e971..2eef7db4cd7d 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -3260,13 +3260,7 @@ def __init__(self, norms, vmin=None, vmax=None, clip=False): if n is None: norms[i] = Normalize() elif isinstance(n, str): - try: - scale_cls = scale._scale_mapping[n] - except KeyError: - raise ValueError( - "Invalid norm str name; the following values are " - f"supported: {', '.join(scale._scale_mapping)}" - ) from None + scale_cls = scale._get_scale_cls_from_str(n) norms[i] = mpl.colorizer._auto_norm_from_scale(scale_cls)() # Convert the list of norms to a tuple to make it immutable. @@ -3377,9 +3371,8 @@ def __call__(self, value, clip=None): """ if clip is None: clip = self.clip - else: - if not np.iterable(clip): - clip = [clip]*self.n_input + elif not np.iterable(clip): + clip = [clip]*self.n_input value = self._iterable_variates_in_data(value, self.n_input) result = [n(v, clip=c) for n, v, c in zip(self.norms, value, clip)] diff --git a/lib/matplotlib/scale.py b/lib/matplotlib/scale.py index 44fbe5209c4d..e1e5884a0617 100644 --- a/lib/matplotlib/scale.py +++ b/lib/matplotlib/scale.py @@ -715,6 +715,35 @@ def get_scale_names(): return sorted(_scale_mapping) +def _get_scale_cls_from_str(scale_as_str): + """ + Returns the scale class from a string. + + Used in the creation of norms from a string to ensure a reasonable error + in the case where an invalid string is used. This cannot use + `_api.check_getitem()`, because the norm keyword accepts arguments + other than strings. + + Parameters + ---------- + scale_as_str : string + A string corresponding to a scale + + Returns + ------- + A subclass of ScaleBase. + + """ + try: + scale_cls = _scale_mapping[scale_as_str] + except KeyError: + raise ValueError( + "Invalid norm str name; the following values are " + f"supported: {', '.join(_scale_mapping)}" + ) from None + return scale_cls + + def scale_factory(scale, axis, **kwargs): """ Return a scale class by name. diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_visualizations.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_visualizations.png index 4b26c18c54c103ab9fe1a16921d2a91d09826d3c..949688a678ea0683227d9d5019b798a2a3cc53f2 100644 GIT binary patch literal 11375 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 LkS~(8c>cctYyvCP literal 10840 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 ZO5a?)h==5CfMww+$g0YeJ~w&yzX1OHORN9@ diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_visualizations.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_visualizations.png index 128c1fb15997fbe8bf76664c098142bd3a3c1442..8f35a5590ce59ab794c75200a3460ae1d1631384 100644 GIT binary patch literal 11220 zcmd6N2T)VryKQXPC>Br<0sWzx$nK1ml<>qoO81GKHpy7TI>5>t18PMxtGkJ_IYi0C)zQ|$)z;ednwz<^i?xG2 zAJ;t|E*`F@=5F`y2?=vpnwj5wYG(1&M96~cDK8H%KMyYt-`#6guC9(QBHY|||GJ;c z!P%1gWrxTP_>R+#a=I=M2#pE(=SY@BrZoh@@sIrDN17h-i^JBgnj0TymSFN)>`_G> zZy`r+9^pOO{Lc}J7rM4Q^bYE`to@h{re^tHFO)s}bfOM}y^$9FPLrSes_kXdcIP|-=iIjER-S&_{++p{ znlSJEsZ#-x*N=eNfsX*4IpWx#VfFAi<3GQx?m0!?E$}h6Ij-|(l+S-M+X^bwcu=neiH6~$mnaE1M!_KiMr9V=Brm(*6S%iC0L(3}@$0W;F__1$|nZ#Pn| zt6yZx;LHT4Qk0es5U?Al^HH5IYL2D(vB|LYfYt9qt>N}biOpwkStKwoSdgCt_USw$ z;u{;~dSXIoJtM|%HgGzek>}i-$2p^Qd-1!=#cSW=M3m1m>*UULW^#y#417s!iKpp1 z2Ht74fc?nlq$q}**Zod`J&6K0rA{y1ixs$8`x6%)nY0)o_%&5{OT5;`JK};Ck4@kh zLL+bOHrsV&RHqA79x|dm%s57vB|P%ns2x~SaLLv?+Jcq$NlAInpFh9eyW&+5*p=M# zi-)BP$H>RL#OEa=-ZtANVSqK{iWcuH)<*C*@Vh9aoSDgm`s`Hi9YrmA1yM7Jr?Q%t zb>SU)E+=^nbS2(&nLf7u@G#bH$S14Hd9N?1*(pU0T;W)qG%Jh@j~B|)dwtqTui$CX zl`FdgD__s=PVQ^wpin=4y}hURoAc#Ca6SZgf)Map5!8>OXF=cU73Z1#jbG{LEce1M z1;oZPp_`)TR|#cAcG@!xKkvz0JPdxBQe&R1(Y^KJ0o~6^D+CtSJV7Js26T`Cm64`q zuUUepSlh)?$W7n&9=rS=@$Ns#7V1&*((^z$F9Z*pZp-p zKFvC0l@yke@()~BljB0)nx)_sxb#1K5>;y07hgXaA=l`TB}6+hA&2ngjHmMjQD-Sp z$efv;yq{^OKa!+=aNrjfx-M63N=v=q4KV;`)nCnQjd$f}FjW{QZ@PWE#=IhmL%tH5 zD*CB}ZsolFm$o3o{omr?JC2s^EyzfrA@J5t&UY*;M9-FxjL#N-!ULdylT9q zKZw|?;qUG(o|SPAyK$#}sw<|MR_S}Iruuk7mF<*;VRRE}!>tMx5<C2+q3tF zc;K&wZ~n-~j@(AHG`4NtFUKWdF!oHsM(OyK&@-;mceuo*`!8Cu-{g7}-Ze6kooboA z+Wx*aI4sKfR=Ul4vq7mraTpU=Zw@M5X>im>y1&1FdCSMb=RwG|LpTbNWMX3SG9ToQ zitR&}7G?~s$Ew~=(}+Tdc$7d3PV4Gz{_JdQYKj2ZFt|uvR#aH1!Ozd1otxYBm1YCK z+P@nMdzXqTop9KW`Stwywkvw?lTrWrlihCEezf?Sf7>C58Pj^rqZi@!Ssi@y)1v~$ zc*0zJtKk%URo14xgBw28sHLEwfHSM;>(iNW*3z_m z=wx7WLxSk|z+DP+u-(@YbzAs(QRRWjre)ptuf^vM(2}Q7Q%h^EmS&{A=K0lc-@dJT zR^;U94?dwmrQXsS-BF3d`tEkRQ{~x5#mDDTF;=EY>`uc_>8y`#5`A(B5{c1kp7O7q zVgNVX8$znjJD?M768J`w}5ou{qNLi}Q{`_r2>MBV9NB zF&HmRv-%K*rf{7&>M*eP zihOd(pOB-&!^0w8lkb+67;q=FTxic@ipH_ z`Mn0pnHiI5sPYA=6E7ZhdOdvl&!6mTOq-RR-GT6{V4De{(x(ZKWS4;E?0j5_Oh~Zv zVks>xjg1%7pK5@UDyJDUKV&qCxD(>%kk>vRG60@4nwpxoTRU@}I!N}B0^Y3Qm>uDB z9aFU(LA7H)m#1iQP-_t`#p2wo!#OdtjM-UP^dF4Q2_Lcs`Z3Amcgk8|LAA+Fy7D4Od|m$9^Y4eKUVTa%2FuH+=V)Y( zW-c1(M@aQvDZB45@?3mW!HNys;<<7euYe4~m3h|~H8DqHIHFsB5I1P_CGsUQyQz#P zt*xw7t*uc$;zc^$#Kz7T3~M_DTiqswtm=Zx-ShSnD)aY}h@QjP zoJ_5qj$WlLLtYl7^nj1t^q(d7{#4C->7m`Hcbm2Y8%T|g_e+vCl=s|F>a84Z*v@Te zkj*J5Xn+3JSerbR{;+^=4Y$^|2WG8i{4pv|n0kpeW(EbjmEvMK``2F&CVaYgti*Sy zuXMMvXJU!nyXGNAaL@gR&ng{iW$A~v2PG{8a_vGFtn99XsX?EftZcOX>SODgm!~fw zZkk(K=CGdY2xS}&e!X?q_=&>rtjfJ$bL3ZFp*kk=aqvH%TU@NI6xutf6ilPPQC!3^ zFb9Rh@k}Gum0!Nxmlhp{+s&WS-(dTevo~N4NbMVu7sHMx$?Q}nq$N(UX?`sbO-DzE z%F6nl^49Sd09JM`E^2+gZN`R}u`j9|Q7R7oVqo z{>)2v=~8Ubt(Eh_xiMkyb5SUHF)_nswg3sqSqB?!kS*es=TnY^HKcBC-T*1KwkINd zynApk9l*)ayK>{_B|{voQD%xciz~wp3d7qOc|7Tu8!dN+jP(}f>U>_BiIW$Xfx&PE zJg*2wG`vI?7rEUQGh1L9;rHR?ZOF!QKBxx2zfHfOW@(uzZTQvxR6b8idb;^XsAxl) zzv)0okP@H-E~jtT@UV=<(11m}M}b{dms3+4JO9vKCGSCE$zYW=eW{rker}FR|4p!) zT=GvA?~@)c&yimWq-k^4R|{mTp;8w-9v|L0*Hz*)ao@a=*8J(y?_-XXo?#;+M&M-t zzS?^xKr;C4TW06o6n-} z0d5)dq|MH@!G*3;>pw{89USbOA>@x3t5OF|6uG~0`o2H=_z$hE<`H)M#f42YsYOmgz0s?BfQw5N_oMn?;N+OV*&$OeJvP`(t%rjnS;z-K`@yNg1hoJEG0 zi`{PD8!L2RT4k%xA(_7L^75K=)w@V@{OA#|NsV!|zD7@NY|2tnhZU5RuxZ?VZPi4v z;|I~Yd+AKT>VQoiDkDQC;+6`tW@v8iU4*OatacSCN<>uj1lN( z`3OIoGH__ANx!^89vpIj7^_~4A(#x)@`R&(u|8My6H#}9rn~!w|47_>Vd!4b?_+}# z<3qtt6k6Kaf@zh3<23(Z2PgkHe^arYc0%u~?)l5KjQz!NHy`2qsHc}6K>_NOd>w7_*wL4aXF)Xb_- znRo-t@6J#z1Gs8WiG1Mx(7FD<4}LaE1pFdye0-dMT!Pen`*!EtDazTwV@%XR8B=ZQ z!&B4Zc`dQx@>)@{nudmUPvhJX_^vw%dFY=D+b*>|QpxYQ46VD7ofee(+^;DAhQ}w6 zQl340$Q;)26Q`W1QBhHG>`eZRJ3xCdJ+tC3ewpMRB_=L)I?;Y{xNNYRi+GpzjP(Y= zJu3Ewxp~IR3h3ys-p~yYo$1Vo#DX|sf@%JjH(J^6d-J$tg?*c8!r}&=)utsg|=pp;!J8SxSdK9j^ zlRqM&ezm9~7U}3(w-(~|!P}Z1NlHZqQKK*fHKiDyufLRQLFndWFTY~;%_lNwcVnX? z<3*qmY)ZV?laHARhiB`!nBPvl1S^f>e)+Sj<6QFKBotb-X_$9wt*ukk8Z~{4OxMwV zI9ObTGUo9JIwRHF*_m2gRE0__VKyIi_V9LB32W`S54Zn%EMvF%TxkrM@PXX<`sNd6 z^{@-BMI_Tc9AL9jZ!&T|kAGTU9JCzRD|078?X*fihzm(k%WfL(X0p%I(nX|5zq$0W zNaCN%hsGD1qlknswjozEHYGLnBo;BFT6%Sn>Tg$U(6YB(I%A_eflN-t#n{@xo1CzLz`47u5+2o;3qe1k0$-b$j>2N z4N|#p5h=wh@>3AA9=tD+UiWV-K7zxu0UrijI2qyX%N`G;yt?eSmg#WJui8Imzd;(U)Zws%_AO^u zSkD{ooySp8Q7=YjK**4`-blO`&3+UnA);bmoI~W#Y(?b=8Uc32vMNr$b>R3xAoS)d z(=E$h6(%;)($WB2K4-BG$vZg}1iyJx+q2_ah4SWQ0Y<_Wj}*|`%PT8bmlFLsQb8}KS{X2q!+B6R~Ur{f3YxGZa&|SXFxQ-iK?3l=zv7W&=S8R52>Xmq;Loo*F zX=!PqnhS$wKuu61OP=V?QH$-UCdao{TDoD202I6z;nd&C1$)Rd+xFsp*uf^S)_>sC z*Hl$CMlj9>4W5uSH#cX$d-uMb$~3F9&OH{3A3#^UWfCRlYdZ60DOEHY?KSycmICo= zdj@T|UBa%C)P>myvtG>hL^3bB2q$>iPCZD-&h6Z*s8aLnKf>u@jLJ|>$c~S{S~^U~ zpBEJs)iN|h^I5je{tEK$8t(rTa6&jXR_m}sZYk8jAU<*Uw|T|y&VBT9s-+f>H$2G(9OGqT zT$aJ84%x^#My$v%^m`S4i%a(+o06J=!E?#vPa-0i9D)x>s(Q36j2)Bm46$M^?+q}b z4b&`A2|a5VkKHXnf%Vh1{`!Z`uyHu>X*u=2$W`s{5~JR~cN!FZPmzMbC<9Ivcw8s^ zJ_4_a_O-1TAq_**JuXI0FnSNp57|dwqE+sEF8O100JCx#gR0ys8NhqrkiW;3X`!Ul z{?axn{K5pG)M2XsY_`x~%37PRAsJdG3yq($RzJ7)b>2bVEUD304Qf#7X6;96Aa!PD zM_}`PBic1RBBIR_F#oMrSD`HcE~@1UOuwB0II0bpfWng}jIO}Q;zGE)+jM7ZIhT@{ z1H~ivKsx_oIXVceA+3?fvZUTArQqJ(P8W)b(bvIxOb?uOX*m5P-(2Qqc4Z3T0+Ol) z)@qPaK1rD~SS{A9N4nXfM@rAfKGB-;+H+vOkART_g`X856>C7-OecUIpiNRHCnp~z z7}A{y0Eq%^-I-y%x3d+vewmIg-7?V=dhZ?p`!)UHlJ?Y(oyb6flLjz7MAX}}qHGeo zWBF|YePpl5&>UKrij$5)tE-(V^Q&{6+1c6Zfb#j<7?e6oJ2^Rd5lUxh85zBaf|RP@ z1SR?`%YUn{hg<&0!7t#FYlJnZ&c;0d`bnI$8L8a+#b!8y5$m(%T*E>6>K^Rb0lY#8 zw}IY)Z8d67E_skAt9rYOxM5W0rUZnR7ao;KDY}h!1HnXg>2Fn*$kTN*krwq?vQedW z-w}*gcD>BDk7yarc9SftGUzy<=Zs9M4>63M!eyqlySQ?Vvvk-VuoFNQH!!_HlGhDO z93KJ3Hjr=fq6e*S=@ka(ep57eFU)7VOhK`!m#FX-POMCYI}oorqKoF42G;h@SCp=l zbbPj$AM{&u_xkvOkg z&!Cdq^MG-I7*mgk-4#<{oahWpQHquD+xyhIchvr`YeV0XAgX=wma-;Uy?7JFz$$@g zY8-RCO?&3YnB({PHTc%@lwPrYg0nNleyE?+n5ziZW62a~PW)_pYIg1eG+$=eyqt7^ zLHn@6E0;SW1K01QB__TbI3|WaU4L8ro|0!L)Cysg2&Bo);z49vg}*nM%l0WR>GKD> z13AeV7oKXa;e67NuRV^xtB5eW)LF%kcAH+6RYb+n|7K91nQZOVDp(24$F{CRrQoBl z8CI@KPlv?tvxMK{GyUcRsaCZGWecM`L0fcImK*@;Kw=aSFQJTr@L?PRgj~ng%1n2E z{~Z80P80Rkjgfa6zkkpFrmI#^P@tD@{OrZx`A2r+~_Y$#CcVTK1<;#(f)1cfpLn)2F7X7rEaCj=LqB>gs+x zbM`DJ{#5NVsi8l`F=Lwpdh4%NJIK?TuO}n!2A?#`kP+8|cTLp4f62fQ(=Nmc$^FXo zufiDtppHn#Fv(8LgTwpIqzieOF?e6FdV4J+)9c%~#=iHpaa zy!_x(O^xKu8#i=@*=&O$XEU~@U##%o6l=i?IMQ@#i>1%yB%aYPb0%dOkw~c-geD-+ zb1aTSDE{~{xASpStF`~ZkD;LqdzTiJsGFIUbsJISo;BCVZg^0&cEv5mCi*R%;1?9sAHHz+Z>81t);)gR zCzY!&;bps|{x+B<@TR&sze*l5$?6Z|7cPF;>_=qdMzUZIgBiv=R){D0r~W=2T~c?v z#js3rnSX#|TdXd&}uo zmOjeG(O7$c7Y2d6OJfwY&q^8pa$&qL2OFpDkuis*z(yUyL&W#Kc||ecc=Ilf*1y6oa5XSO=i3`$^iU4J zbx@a3uu|g3K+VEUu>OOku5&3E1ABEs-S(6-?uPsdG#9!!2ACg_8_%*o#==QBR~vA! z+*FFOI*84AWk|j%*j(i#3{-E~!?Pl3x2)yj<-8%!m9^Hy3X+>kA=xrqxKJA)d+Goq zs`G_4aZfCp!g9*y>zVRSQ@jvyN|Ai~PPTu-WxHJ5W=tLNSQb@M($@?%VI`wUenJv) zPv-~Q z9aV`Yy+M$OEc+27Uh|xlQI53N$XTMb*pf@l$T_gv?h}gz=XN;wQSTc_&vxD&oIa^E z7(pgZ%_kw0-~L5{S)qD*u>!tZP2p)hJy0eQS2-fG1h%bQnfx&)nq8C_A&QQTi__9T zJ~C@igvQ@WR!P{h>4ERXVsQrAso^a9a-&^`73dLa2n$OUQv`OoaT zX|lUJx|aZL)%$eOVG-K>{vz2DMl>w0Ua2O&j+S1B^KumCk(HzX#xD z(^N;GWm0#<6K1t;OxTy=Nv0D6FB(7IUrZ!cv@@tmD#U{FbGGX3`;@~q3V%-(FW?q7 zy%;Tf=ZwZ;q8gNRqtsrQxV-Ybq9R+^?eVtXT6V{PDLL_=B>yTtHzozFW{Q7qCTYmj-(Ke|;$s z`Ce;Ly>xU6oq<@I`Nic?6u%!XyrV;+A|tgsPvhizP6a8L&=j9x4)ZZ!m@~U6&wz?> z9g{>$51W;oGyZyC-#rm(V7vK>GxmM@Ny`u{5KgTh!3gV&Zdr@UmlCNGT+)YFy)tmim(I( z#fP-_rRy$}sD}O6t!l?>AYuHQqq+ec)znzrbbCIQ6s+N8KGCZ<9Q~JLLu4vfX4-5l z=e%)#q%)yEu5!z>m;1do8inPq(B0DXp3NUWri@O+LQfP%53SqYbx_Y9*x5NTFDLsi zdV)}l*GF+AEmE{+i7h?5*iuL&FzS#{ zR_6~^?s6Jd(EcPLU>cg5U77Pvi5_VE_4x7e3-?WY2x9Xd5$fHH_X{=pjvR!|e_B;o z+1||{96H6d^L+(oBKgFuOD+0&X?2t0d82{|Xq649rLYHknAJ@PQvO@@;D4K~l0JO6 zRIxWeJ_qTQ`=M{bGVKEbKwyYSd&@`4R~}^ z)ZF&ye&rpk2@Q}sO5T#GdKFB8y>^XRg1}YMWuVIFLLz(k$fSoGCI*O5&ur6w$OsVo z@kqWu)a1Y1YqWIG*g?<#VV`g-uv?FZc)k|??LPfR)f7f3$OLOj$D0dHGnS#SxDTpe zHh*eFhE2cooPEyvB2r|3{iKPFAjUnWlAB!Z zi9JuAatYY>49{s$i;r0>z)=moAQpUE7Aq36MWa$=(%X=2UC581^3+YP4}un^zhDN@ zp8#3Te{rXO#4fPcfINMh5!z1U5kF-^Cu$9RJ^NF+gk`Bg*UgFFquSSg38t+lfaWCi zr>(DaSFSVgvHpSG>6W;uHLu#9;NW0TzY1H+2YG^GScXLi46ebhNZO!xV(Ee@}l8Q`yZ)0%I*lRu!n`YX1C_Pb_DPJrHrq(_K4>P=UL|^| zASL(bi;7SSv#)(&qg|SvL>mVKqN>KXiaZB&>Fv3~(e(E*VU_>biQjOsJg6YpOZ%Uw z?e6JO2;ZB~zD(Lp++Rv9Jl1D&tycjyyn}~en7?B?!nya0j~I@^0>Z@2Kz9#2lHk2t zSyWU61yC;F>NjmRyTHp5E=-132&DL*>gQu*{fpKwZk$>9F|njGOigk9+^H;Z1F)V2 z$^};L@x};~O#lda8|b-!rUoqO3yzBNy{>yV4-4x_cOx>@py#?ePEEcH0{K5_ylb&O zXacNu1kDN1Vo02s45T{ou+ahn`R_INRcE#Ld3^gaz|Y^Hi1NnQm5~oU2w}w>rq?lH zj;Tm-Am32tYG^s*-lSoxEV|dtJ3H@nyuY*^qab@}Jn;JhhCq2Lp@olpn~NwTH!=lD zFb^O320Uo;?F*!!jds<4HBF_+QGRUB6&sj2^5So5_+RhIVfWy(ht*#O78lX@#YHu5 z@0>9#BO~{mjCx6>=Xx7)j&j{{w~RvlajV literal 10737 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') x = np.zeros(2, dtype=dt) x['f0'][0] = np.nan From 63d606fea98525dea06b134a11bffc9d6c360cea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trygve=20Magnus=20R=C3=A6der?= Date: Wed, 5 Feb 2025 21:18:38 +0100 Subject: [PATCH 06/12] Fix for mouseover image data with a MultiNorm If an image is shown, and the user hovers over the image, the value at that coordinate should be displayed. The number formating is handled by colorizer.Colorizer._format_cursor_data_override(). This is now updated to also handle the case where a MultiNorm is used (i.e. a bivariat or multivariate colormap), in which case multiple values are displayed. --- lib/matplotlib/colorizer.py | 62 +++++++++++++------ lib/matplotlib/tests/test_image.py | 12 +++- .../tests/test_multivariate_axes.py | 48 ++++++++++++++ 3 files changed, 100 insertions(+), 22 deletions(-) diff --git a/lib/matplotlib/colorizer.py b/lib/matplotlib/colorizer.py index ca4473d4fa8c..78c6f64fbe65 100644 --- a/lib/matplotlib/colorizer.py +++ b/lib/matplotlib/colorizer.py @@ -464,39 +464,63 @@ def colorbar(self): def colorbar(self, colorbar): self._colorizer.colorbar = colorbar - def _format_cursor_data_override(self, data): - # This function overwrites Artist.format_cursor_data(). We cannot - # implement cm.ScalarMappable.format_cursor_data() directly, because - # most cm.ScalarMappable subclasses inherit from Artist first and from - # cm.ScalarMappable second, so Artist.format_cursor_data would always - # have precedence over cm.ScalarMappable.format_cursor_data. - - # Note if cm.ScalarMappable is depreciated, this functionality should be - # implemented as format_cursor_data() on ColorizingArtist. - n = self.cmap.N - if np.ma.getmask(data): - return "[]" - normed = self.norm(data) + @staticmethod + def _sig_digits_from_norm(norm, data, n): + # Determines the number of significant digits + # to use for a number given a norm, and n, where n is the + # number of colors in the colormap. + normed = norm(data) if np.isfinite(normed): - if isinstance(self.norm, colors.BoundaryNorm): + if isinstance(norm, colors.BoundaryNorm): # not an invertible normalization mapping - cur_idx = np.argmin(np.abs(self.norm.boundaries - data)) + cur_idx = np.argmin(np.abs(norm.boundaries - data)) neigh_idx = max(0, cur_idx - 1) # use max diff to prevent delta == 0 delta = np.diff( - self.norm.boundaries[neigh_idx:cur_idx + 2] + norm.boundaries[neigh_idx:cur_idx + 2] ).max() - elif self.norm.vmin == self.norm.vmax: + elif norm.vmin == norm.vmax: # singular norms, use delta of 10% of only value - delta = np.abs(self.norm.vmin * .1) + delta = np.abs(norm.vmin * .1) else: # Midpoints of neighboring color intervals. - neighbors = self.norm.inverse( + neighbors = norm.inverse( (int(normed * n) + np.array([0, 1])) / n) delta = abs(neighbors - data).max() g_sig_digits = cbook._g_sig_digits(data, delta) else: g_sig_digits = 3 # Consistent with default below. + return g_sig_digits + + def _format_cursor_data_override(self, data): + # This function overwrites Artist.format_cursor_data(). We cannot + # implement cm.ScalarMappable.format_cursor_data() directly, because + # most cm.ScalarMappable subclasses inherit from Artist first and from + # cm.ScalarMappable second, so Artist.format_cursor_data would always + # have precedence over cm.ScalarMappable.format_cursor_data. + + # Note if cm.ScalarMappable is depreciated, this functionality should be + # implemented as format_cursor_data() on ColorizingArtist. + if np.ma.getmask(data) or data is None: + return "[]" + if len(data.dtype.descr) > 1: + # We have multivariate data encoded as a data type with multiple fields + # NOTE: If any of the fields are masked, "[]" would be returned via + # the if statement above. + s_sig_digits_list = [] + if isinstance(self.cmap, colors.BivarColormap): + n_s = (self.cmap.N, self.cmap.M) + else: + n_s = [part.N for part in self.cmap] + os = [f"{d:-#.{self._sig_digits_from_norm(no, d, n)}g}" + for no, d, n in zip(self.norm.norms, data, n_s)] + return f"[{', '.join(os)}]" + + # scalar data + n = self.cmap.N + g_sig_digits = self._sig_digits_from_norm(self.norm, + data, + n) return f"[{data:-#.{g_sig_digits}g}]" diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index 0e9f3fb37fbd..6fa04515d8cb 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -14,7 +14,7 @@ import matplotlib as mpl from matplotlib import ( - colors, image as mimage, patches, pyplot as plt, style, rcParams) + cbook, colors, image as mimage, patches, pyplot as plt, style, rcParams) from matplotlib.image import (AxesImage, BboxImage, FigureImage, NonUniformImage, PcolorImage) from matplotlib.testing.decorators import check_figures_equal, image_comparison @@ -1130,8 +1130,14 @@ def test_image_cursor_formatting(): data = np.ma.masked_array([0], mask=[False]) assert im.format_cursor_data(data) == '[0]' - data = np.nan - assert im.format_cursor_data(data) == '[nan]' + # This used to test + # > data = np.nan + # > assert im.format_cursor_data(data) == '[nan]' + # However, a value of nan will be masked by `cbook.safe_masked_invalid(data)` + # called by `image._ImageBase._normalize_image_array(data)` + # The test is therefore changed to: + data = cbook.safe_masked_invalid(np.nan) + assert im.format_cursor_data(data) == '[]' @check_figures_equal(extensions=['png', 'pdf', 'svg']) diff --git a/lib/matplotlib/tests/test_multivariate_axes.py b/lib/matplotlib/tests/test_multivariate_axes.py index 3e3501dd8dd7..4fd0f0de6295 100644 --- a/lib/matplotlib/tests/test_multivariate_axes.py +++ b/lib/matplotlib/tests/test_multivariate_axes.py @@ -629,6 +629,54 @@ def test_cmap_error(): mpl.collections.PatchCollection([], cmap='not_a_cmap') +def test_artist_format_cursor_data_multivar(): + + X = np.zeros((4, 3)) + X[0, 0] = 0.9 + X[0, 1] = 0.99 + X[0, 2] = 0.999 + X[1, 0] = -1 + X[1, 1] = 0 + X[1, 2] = 1 + X[2, 0] = 0.09 + X[2, 1] = 0.009 + X[2, 2] = 0.0009 + X[3, 0] = np.nan + + Y = np.arange(np.prod(X.shape)).reshape(X.shape) + + labels_list = [ + "[0.9, 0.00]", + "[1., 1.00]", + "[1., 2.00]", + "[-1.0, 3.00]", + "[0.0, 4.00]", + "[1.0, 5.00]", + "[0.09, 6.00]", + "[0.009, 7.00]", + "[0.0009, 8.00]", + "[]", + ] + + pos = [[0, 0], [1, 0], [2, 0], + [0, 1], [1, 1], [2, 1], + [0, 2], [1, 2], [2, 2], + [3, 0]] + + from matplotlib.backend_bases import MouseEvent + + for cmap in ['BiOrangeBlue', '2VarAddA']: + fig, ax = plt.subplots() + norm = mpl.colors.BoundaryNorm(np.linspace(-1, 1, 20), 256) + data = (X, Y) + im = ax.imshow(data, cmap=cmap, norm=(norm, None)) + + for v, text in zip(pos, labels_list): + xdisp, ydisp = ax.transData.transform(v) + event = MouseEvent('motion_notify_event', fig.canvas, xdisp, ydisp) + assert im.format_cursor_data(im.get_cursor_data(event)) == text + + def test_multivariate_safe_masked_invalid(): dt = np.dtype('float32, float32').newbyteorder('>') x = np.zeros(2, dtype=dt) From 5189e613dc548726d1a149fd4ce0c86344a89d55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trygve=20Magnus=20R=C3=A6der?= Date: Sat, 8 Feb 2025 11:17:52 +0100 Subject: [PATCH 07/12] More feedback from @story645 --- lib/matplotlib/colorizer.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/colorizer.py b/lib/matplotlib/colorizer.py index 78c6f64fbe65..3d113ccde36d 100644 --- a/lib/matplotlib/colorizer.py +++ b/lib/matplotlib/colorizer.py @@ -249,7 +249,7 @@ def set_clim(self, vmin=None, vmax=None): The limits. For scalar data, the limits may also be passed as a - tuple (*vmin*, *vmax*) as a single positional argument. + tuple (*vmin*, *vmax*) single positional argument. .. ACCEPTS: (vmin: float, vmax: float) """ @@ -648,7 +648,7 @@ def _get_colorizer(cmap, norm, colorizer): cmap : str, `~matplotlib.colors.Colormap`, `~matplotlib.colors.BivarColormap`\ or `~matplotlib.colors.MultivarColormap`, default: :rc:`image.cmap` The Colormap instance or registered colormap name used to map - scalar/multivariate data to colors. + data values to colors. Multivariate data is only accepted if a multivariate colormap (`~matplotlib.colors.BivarColormap` or `~matplotlib.colors.MultivarColormap`) @@ -673,13 +673,13 @@ def _get_colorizer(cmap, norm, colorizer): before mapping to colors using *cmap*. By default, a linear scaling is used, mapping the lowest value to 0 and the highest to 1. - If given, this can be one of the following: + This can be one of the following: - An instance of `.Normalize` or one of its subclasses (see :ref:`colormapnorms`). - A scale name, i.e. one of "linear", "log", "symlog", "logit", etc. For a list of available scales, call `matplotlib.scale.get_scale_names()`. - In that case, a suitable `.Normalize` subclass is dynamically generated + In this case, a suitable `.Normalize` subclass is dynamically generated and instantiated. - A list of scale names or `.Normalize` objects matching the number of variates in the colormap, for use with `~matplotlib.colors.BivarColormap` @@ -699,8 +699,8 @@ def _get_colorizer(cmap, norm, colorizer): *vmin*/*vmax* when a *norm* instance is given (but using a `str` *norm* name together with *vmin*/*vmax* is acceptable). - A list can be used to define independent limits for each variate when - using a `~matplotlib.colors.BivarColormap` or + A list of values (vmin or vmax) can be used to define independent limits + for each variate when using a `~matplotlib.colors.BivarColormap` or `~matplotlib.colors.MultivarColormap`.""", ) From 86c46a49a8108340a5aed43b324231d10de75b1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trygve=20Magnus=20R=C3=A6der?= Date: Thu, 20 Feb 2025 21:02:17 +0100 Subject: [PATCH 08/12] updated test for im.format_cursor_data The previous version of this test passed for numpy 1.x but not for 2.x. This should pass for both --- lib/matplotlib/tests/test_image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index 6fa04515d8cb..1e1b9ed244c8 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -1136,7 +1136,7 @@ def test_image_cursor_formatting(): # However, a value of nan will be masked by `cbook.safe_masked_invalid(data)` # called by `image._ImageBase._normalize_image_array(data)` # The test is therefore changed to: - data = cbook.safe_masked_invalid(np.nan) + data = cbook.safe_masked_invalid(np.array(np.nan)) assert im.format_cursor_data(data) == '[]' From e63aa3ddc0e7973de033a1c49735e762a5873dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trygve=20Magnus=20R=C3=A6der?= Date: Sun, 23 Feb 2025 23:06:12 +0100 Subject: [PATCH 09/12] Apply suggestions from tacaswell Co-authored-by: Thomas A Caswell --- lib/matplotlib/axes/_axes.py | 4 ++-- lib/matplotlib/colorizer.py | 4 +--- lib/matplotlib/colors.py | 2 +- lib/matplotlib/image.py | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index bc79f6ab48ba..aaab387857b8 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -6287,13 +6287,13 @@ def pcolormesh(self, *args, alpha=None, norm=None, cmap=None, vmin=None, - (M, N) or M*N: a mesh with scalar data. The values are mapped to colors using normalization and a colormap. See parameters *norm*, *cmap*, *vmin*, *vmax*. - - (K, M, N): multiple images with scalar data. Must be used with + - (K, M, N): multiple layers with scalar data. Must be used with a multivariate or bivariate colormap. See *cmap*. - (M, N, 3): an image with RGB values (0-1 float or 0-255 int). - (M, N, 4): an image with RGBA values (0-1 float or 0-255 int), i.e. including transparency. - Here M and N define the rows and columns of the image. + Here M and N define the rows and columns of the mesh. X, Y : array-like, optional The coordinates of the corners of quadrilaterals of a pcolormesh:: diff --git a/lib/matplotlib/colorizer.py b/lib/matplotlib/colorizer.py index 3d113ccde36d..54981f112093 100644 --- a/lib/matplotlib/colorizer.py +++ b/lib/matplotlib/colorizer.py @@ -518,9 +518,7 @@ def _format_cursor_data_override(self, data): # scalar data n = self.cmap.N - g_sig_digits = self._sig_digits_from_norm(self.norm, - data, - n) + g_sig_digits = self._sig_digits_from_norm(self.norm, data, n) return f"[{data:-#.{g_sig_digits}g}]" diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 2eef7db4cd7d..039534bedf25 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -3266,7 +3266,7 @@ def __init__(self, norms, vmin=None, vmax=None, clip=False): # Convert the list of norms to a tuple to make it immutable. # If there is a use case for swapping a single norm, we can add support for # that later - self._norms = tuple(n for n in norms) + self._norms = tuple(norms) self.callbacks = cbook.CallbackRegistry(signals=["changed"]) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index a6f74cbd6e97..f0a05793972f 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -671,7 +671,7 @@ def _normalize_image_array(A, n_input=1): " must be explicitly declared, for example" f" cmap='{A.shape[0]}VarAddA'") raise TypeError(f"Invalid shape {A.shape} for image data") - if A.ndim == 3: + if A.ndim == 3 and n_input == 1: # If the input data has values outside the valid range (after # normalisation), we issue a warning and then clip X to the bounds # - otherwise casting wraps extreme values, hiding outliers and From cbb19793ae2c5f926db1847188ee4bee43790be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trygve=20Magnus=20R=C3=A6der?= Date: Mon, 24 Feb 2025 21:48:05 +0100 Subject: [PATCH 10/12] updated test image multivariate_imshow_alpha.png due to a fix for alpha in imshow --- .../multivariate_imshow_alpha.png | Bin 8894 -> 8894 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_imshow_alpha.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivariate_imshow_alpha.png index de2d50fa31b0f9133d1621c70942d1c019019177..81697387500bd012659b415691140de78fc23ad3 100644 GIT binary patch delta 72 zcmdnzy3cijyRD&~fnG{#nW?dbc6ySbxq(S?lA&>mUW$={k*R^Pfu)W@MoCFQv6a4l cZemG6PJT&FW|CfhQM$hOnl0Bhwpb|v063l)F#rGn delta 72 zcmdnzy3cijyRCtqfnG{#nUSTDc6wS`qJ>40d6IduUW$={k%@tsp{0&OMoCFQv6a4l bZemG6PJT&FW|CfhQM&%yNViQJTdb4-Pb?T@ From e1ee7dcc73a5a3f9e8e9ca8fe9da68b653da337e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trygve=20Magnus=20R=C3=A6der?= Date: Mon, 24 Feb 2025 22:18:46 +0100 Subject: [PATCH 11/12] change call signature of colorizer._ensure_multivariate_data() changed from colorizer._ensure_multivariate_data(n_input, A) to colorizer._ensure_multivariate_data(A, n_input) --- lib/matplotlib/axes/_axes.py | 8 ++++---- lib/matplotlib/colorizer.py | 4 ++-- lib/matplotlib/image.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/axes/_axes.py b/lib/matplotlib/axes/_axes.py index aaab387857b8..a072867ff050 100644 --- a/lib/matplotlib/axes/_axes.py +++ b/lib/matplotlib/axes/_axes.py @@ -6208,8 +6208,8 @@ def pcolor(self, *args, shading=None, alpha=None, norm=None, cmap=None, # If provided, _pcolorargs will check that X, Y and C have the same shape. # Before this check, we need to convert C from shape (K, N, M), where K is # the number of variates, to (N, M) with a data type with K fields. - data = mcolorizer._ensure_multivariate_data(colorizer_obj.norm.n_input, - args[-1]) + data = mcolorizer._ensure_multivariate_data(args[-1], + colorizer_obj.norm.n_input) args = (*args[:-1], data) X, Y, C, shading = self._pcolorargs('pcolor', *args, shading=shading, @@ -6465,8 +6465,8 @@ def pcolormesh(self, *args, alpha=None, norm=None, cmap=None, vmin=None, # If provided, _pcolorargs will check that X, Y and C have the same shape. # Before this check, we need to convert C from shape (K, N, M), where K is # the number of variates, to (N, M) with a data type with K fields. - data = mcolorizer._ensure_multivariate_data(colorizer_obj.norm.n_input, - args[-1]) + data = mcolorizer._ensure_multivariate_data(args[-1], + colorizer_obj.norm.n_input) args = (*args[:-1], data) X, Y, C, shading = self._pcolorargs('pcolormesh', *args, diff --git a/lib/matplotlib/colorizer.py b/lib/matplotlib/colorizer.py index 54981f112093..e7adaf055944 100644 --- a/lib/matplotlib/colorizer.py +++ b/lib/matplotlib/colorizer.py @@ -582,7 +582,7 @@ def set_array(self, A): self._A = None return - A = _ensure_multivariate_data(self.norm.n_input, A) + A = _ensure_multivariate_data(A, self.norm.n_input) A = cbook.safe_masked_invalid(A, copy=True) if not np.can_cast(A.dtype, float, "same_kind"): @@ -862,7 +862,7 @@ def _ensure_cmap(cmap, accept_multivariate=False): return cm.colormaps[cmap_name] -def _ensure_multivariate_data(n_input, data): +def _ensure_multivariate_data(data, n_input): """ Ensure that the data has dtype with n_input. Input data of shape (n_input, n, m) is converted to an array of shape diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index f0a05793972f..904a19db44d3 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -646,7 +646,7 @@ def _normalize_image_array(A, n_input=1): Check validity of image-like input *A* and normalize it to a format suitable for Image subclasses. """ - A = mcolorizer._ensure_multivariate_data(n_input, A) + A = mcolorizer._ensure_multivariate_data(A, n_input) A = cbook.safe_masked_invalid(A, copy=True) if n_input == 1: if A.dtype != np.uint8 and not np.can_cast(A.dtype, float, "same_kind"): From fa40bef06494116cf8305becdc6143598a1a2246 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Trygve=20Magnus=20R=C3=A6der?= Date: Sun, 6 Apr 2025 13:06:36 +0200 Subject: [PATCH 12/12] updated reference images in response to fix on main --- .../bivariate_cmap_call.png | Bin 10570 -> 10566 bytes .../bivariate_masked_data.png | Bin 15397 -> 15267 bytes .../multivar_cmap_call.png | Bin 10318 -> 10313 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_cmap_call.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_cmap_call.png index 9bf72bca8115cc918dff8d2625f3a69320dcbc55..e350c6c5c1805fed7deafc9c2447a1bfef8bda75 100644 GIT binary patch literal 10566 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 literal 10570 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 diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_masked_data.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/bivariate_masked_data.png index 7abfe8e5ef6b102f37a07a62eced3b6fb4965cd3..9823486351433222e1904f50325d169c41172719 100644 GIT binary patch literal 15267 zcmd_R2Uk;F*EJj)pdd{oC`bSmM7kioNE7MOJE4e3@11~(h;&3CAWgb-q=%BwJE8Yp z1BBiJgz^P^uIs*^@s08RfcIqp*&`!4XP>p#o@=hT)((8DBy;!9!#e-~;I8Z&DOCXA z1|4qPMu3O=Pa5w35ci_!EUoRVX7}FN&DhZlplIxDZ*AvnZDB&^YUb!4i1}tzr=3mXwI=pdSf4V;oJ6abesSH z664FiYrn;^EC2w(Q&}l-b@zmgM7=!LF`b!Gng|B2 zZ%;I1Z%fF%BX5W~{rK1)m`dOmc<-2=&@_l^^A_4$wOMu6*AZ~dqT+`Jkv z`duTq8Ytl1AiWyI68+zDAyWsOapIt0AD!gWMW%x;?w*z5d_66QV3Euu!WW!;wr+mV zK*+JOnw30l0dArX;nJWX_v6Hy@h>7#co0z1+&I16FVEp2%gUP8DbGP0gkoE4C^H$OH9|&x?OCG+U1Br89fMDN^N7VtBl!#Ro1QRB&It7y53wfD(D@-TMh!sp)O>clf7ZNp{##Hs5t=}P?$w%94o*l|EACZ_+*9K7 zo>neg%1AyMnJL^l4g*E+MG9dep_8hP@}S{0-=G-Pim1|k$VBC%asI6(B(^L@t`OBw zj?4g^MU$ZMFV;yqAIWaMSqppOwm8U^zL}ZsujZz zHGCX(R!8D*tx9#swfD(ZYGV7~!hv}%vad3u$}XU*><33IlB zH0_l=`Cbhgp7A&jaHI8`YFPCHozA{?a3`JdkKEr0e*-#72_-(Z#WcN#-1OO80QGx` zZTE$Sd5m1Z{%C+N=Cee9BaTOSvC~KWU`UY$SZtRCG)yviJcs)XT5NI?oO38ZjJk6p zLWJSs-qt|mbZPx}CRGemMze&V;2J&=lZ=Oe;hT!E^abtml?uDi!F<6(7rVEZLpO^Q zY}Kk^Uto3Ngr{`HBxK69a3vc2 z4HuTfWY0C`T9n8Z>|Mxu*kG$xt+eN1A{unmq~_QIS4$+bkm*R>`e40LTq*QWXQcJf zj883me#{O1H8s{rc5tb<2-Gz5i}kk1$g|Fkq{;)l+GFL~ET9GIbr+joEa8N%+!Rc% zz9RMP*ZCy6JuPd$JZmOnGjq`vF9kT#D&F)6U&U=Q7^WUGj+rRn=OutIoK|6J0`yvc zJrUW7sxqH}?NRB!5%icp@Ej=Fn)V=aonAf6&)Q!u^y#@=MbD}3to=g{$OzK3NXSvI zbdhQwfRXa7-L-;; zCZvD@=Kq4yuFr0HGyBCCyXQ7DF6}_=_iK2vva;?S^3wMp?1~Gf&riXK z)8M@0ify(TeuFN=Q5QHduMpN^?Doc?vL3Tj;obPf;fU42-GZ2znD673q`N*RAnq2p zF#DWs1~L(L@uqu%|BR)2qhmKAo*igX4tDPGZGC4@dlrud)pvUPCwakr(*e%$*aXpju-K3^Pp~|Wdh<)>Kjq*+zGXd2LJHDW>y?O4Y zxddat3&Q!RK`VRN#M(VQAdHW^+$6Y8)|YS+Koouh_uxhb{}npoZYfz^475BAElgy3 z&c#Ax-AwuE$2nytvEXO#BvL;B0Nnt1M`<1L`GCq(aGlsFX`2YI((;=);G>H%z;UYX z=rfBE&-$c2H}E(InN{|rZ22x#vivXl%7+lX&S46xgX8LX>C@Q*eC(;sCWT1^)ytP)m1ZUs@l!&M2u}(w$(Ejrsl&fvn!)tSUGw2)(FQ&3<4Oc8~%m zw1NCa&zEOoL~8@plZH(vj31q-=kx?Gp18heYq!SEbFYvDn)yV(uq_5Uydfg@(|Y8m z`mHgmqZl>Ax2m9J@3O8)gT#eQul8UZ0*GVdGK>uN#M@R^SB>QAs@=BMkcmPANo_Mn z`28i|ncv$(<1y4^iokm~p&2}<=gvlskb5UCJMpX8iqr9JYruM|WNIvN? zQ`tXAWv4|8%KAu^y5!t6ayOW{;JDM^Y|TbRxC89`Tt{g2^6>uQLUUOI7j&t|SnZI3 zI8fYVJIC~Gr0BL}f5}!tx$-FWAtSLl-i-)!%S#}p=(Z?9z{VTFrf6gHW`l9J+BT=0 zkrp=M29ARKUrw)QU3S+Z7ZMCs4Czi(^#!x{kWt61c+vjpxl#!sb-C!g*dO=5!1J6! ztImH~RX)@Ivd9pgujTM9&FgC61R8L>V!X055V2b(_vl{G>nT*i=YF9)mG!4wRBLI! z(CdH1dqcCz7fnrd6+{c1i_!=U(h=^6q`DFl2fCx2k-$yY8d`QRbX^!lNYz}d4}Yz~ z|9Wnc4{7lt?gsg%COX_!E%|b-&BgSm0$c2@iHyUiedHL8hriE!mRL&(Bc4>n!~r50*X-Z5}Y zl(Y<)M@vU*=iyCYNx0q+U9Y3L+$WY`y9$veU>anT~HI&RQU?bf_IT-mG{bNl6Ku8f$C*G43W2x6q`K{l7y>B8* zz}UC+F6-sSfs)6boolcn9HI~`n~Hoe0!#Sw3=`M^CC}m7)U999p577En zBW~y;Dr!((-@Ma!=1#WZLc6XvS1~371CjbQ(E+;1@aRhDjy-`+9^4KU+c(O@tfSA# ziCvM`X zA6qyx78O&kSj~n%9#mcaI5AvnRSL)li03^#5iHT9{E}UB)U~{guZ#mB04E;~pkKw? z^n*Wt3`}jj16}!6ewb)MU9k`%*_W+U;F!aW)hx9To)HxoXV0v5e@tY0(c&L=z`*X`Rcmbjt0UI4%&pzkLZCJaM|5 z`0U?(!M}-EPC}@%)r?Yqv+V7a?CEboJ1v1Q?&CxDLDU)H+5(LC%Y>0v(|6j+fdh2& zhO@(3hHA${ox-$TV%cltS582VbAn&n`>xXi#%=(slIWw7E*r=IVU2!L z)~jx$lQ*fp>vyf?fmRwHue3s^_ZOc%L8|Iigyq5JFV$@n?u0--B)DWQsHI^slM}7B z@4lmptE~$$Ya}j>J$pg)c!Bkh+3cAg=S|eE)7{lcCpn22GLJp9ox73DIou-*k}G|(}VHlHk+sZ6O3$`Tn3hMpH|gH1L#@hvN`9*8Byag0www4kQHaY zp8Xu$gmCWo7{@1mb+>Ffky82tXkx|^wlkk8m>ECseG5vK6QOWLFHK~5dqQV)FRI4O z*msX1l+noCjfW(TI}^-YHuYLr^^2!i_e5)A_w8;Dv7glKPO4HSYetTGkNJu@!;4e}-dpciUdV_?sToD- zuelb$cS9?7yz!KCV#usrg$PB;Y)@^5vf@970@jJt&D;B6n+l{46)?`}9f?6`>7LDkKCXBWLrIc||l($sUjylzrciU(QC(~!vI2)dEQ$D9335`CO=guhCcK9&4t_>n4kOvBa zm(QH9K{KZfy}^cy`vSCUp!@%|&-ehtW()hk_Ns2p{ilktQs88#!ALa8x>o{D&j{E_oQ~YuhWjbqc{4KfNjghNqa2F61(Rebyyp_~2^05r zi7{%|Pa*J~s14>X? z9Xgnr@4V^-W_tRF+TVyPKYLFgT=X{LE1`{43Pe;gQE(xZj;NvVhdO^VubpTmqTNQR zpoGl5`EFe!#m^__f*ck5a@@r2?Jy-Io21TUn8#6HBGN)=H9f5;X26(Gn^{Y2I9ln?*VID$ z7zli4kFk4FTU{)e1y3bQ7C!EzO|H zQs1b1GfFE^2br+@DD5yBLkoP-Hw5`tWv-xEi0Wh4=auaI`llDSO;KVrr!O|hs82g} zn*@=M+4o~tsGZ`_-lwOWm5w=s!TKxfjL?CM76dIc><`~JH3X>o;aVxcu zokT(?SWGL=?2C~vTiUA-49OsIiOz)nso&?Tbql*(H@(w0;MB|b#xdwqqtkD|#CSvwyQm*M zY7E~P^(5Xa*<9id6YHM9eJkkjnOV45JS1J~&Oi3U#kFA2uo?9Z)6-AD3M;M;{ssn` z)!ls-wD&%#42HmZ$21O`eZa$TS^l^h`j?DJ@h;FIfB6Asfxa6|W0ixFS)NUCnr*Gn zC{+VhkDBa}^g5!ojf4Hw@r<6O-hV;tFjD!AV0One{VMGH;o->Pb@pRrDxr(BS$sKj zb8|rCt1oMc zw|D*^NqQt}XFE5%T|!OsnL#Ipbt=V5)B)3ure&zYR(Vqzj&$Ops76hs4 zsUE+jIBZ?a))sQ|_72r8z5B(mQ5xCG8qiw$#Yh*QD}LImvW0yltd&`N21BM2 zc3)USE7$_WellH!8m7x&7C2B0PZ}Ds?nnM2EO35G$DR0|G*h!oK zn634D#)g-SRmJE9ukU>J&>c&^N0PKP&G3ec8Zl^1_$=)FrCdiGqg|1SeEK9L9cchZfo zl|s#!i9$!w2^?8siVcP2Au4SG;N=ah=W7P&Bl908FWPeXY_KESq3S;?lW*zHNfnZM zFP#^Ynl5pT{h@Uu&@I@L?j$;o{g*lE6s^gm%|{~eMkG=}J3%?q4*b%i&|msIeF;@*~5O5fdEzsNk>=c4ZiMQal_aG>V2=6fHw z=`;=ks}nPY@5*P%tsA&2_`+3c%>FRlmw0RF*!lGhYvPgwQOlVnPVafIRs()aYq}=i z2Njq(zqNa8Nk>eAe}&H;f3p)VgUjqhiBfZHI>NCA@_gmNm|Z5Uji6%x=ldC$+@ye$ zg3E%P^Ur*3R{i<4*M@}&&j(07WJxu{oE;SS3(H4Kt|PxSs%v$>q8Km=QisZMQkqP> z?65u-lpyO#xg>_NJeow! zMP->;2D>!Lx55mDe_WW5?DPa(!ReLPZ4=^Xsl|zWjd%s62QLtz6u9G0z~Z<~I3gg_ zFU#|F0dD}RDRZj+ydU|56BV%$m=&K{#~+UT2P|stMk>Za$P!W%(ecztyqen5Ylvl%YQlIFH++$;Jx^1 z_Rq|$#!bL*2Jn7-24cUU*d;0LmsRx8XC&0Ngqg*T;;@?rtJ($=hgc4fdz33mO6mU5 zN{9W{pq*T<>D4&3bH30_WSs1YGjObAwdlkr{C8c&Q{Q~U|Z^vgv_u9wng-l-}+D~dg#eDddd$2AoN%Zk4xINgE z;j3~@)MGErr*=x#3ao1+^}pi8dtY$HDxOulswsshi{4(zcEc|>?X&o+Bkud1xe8{I zhb&pe@ldfW@=(~80oK)f*av-1oYDMf;qW`~Xagf$l2XZJOZ$a5dv`8r6YU2xE3QEOW zJkrVmQ`ho3Ggmokss0=v-X+uK@4PF{PYTKBiH(Ra43;*qG+)!jvP_|!#WioL2q z!r@(3*`Fk*^moe)3<|#&SDhFAX9w0xgHOK7-#JaZ@OI}S7`w-t_~{vFfZT28{p|CN z4AD&c^lsPA(BZe+LnQWA0-bEv_?O?vT#Ics$lHg_{VrKwl9^nozguT((PZNDB@q&3 zU?r!X;Y+{LZ~k()09AC8?w{G?V9OKbKCll&^HwC7#|MCyR)iK+d>3Ya%T7WAP30kwBk4Hp*&Z_SO$2BCYyxf=?_tSSFB ze#x&RnUf*?e(&*PyE|gKUd^vJOM+K9auZM;5ZcNPE8EU!=I64%k0ti=7g)ignvw4& zmoo{}DIxV9%Be-JKSK$pvKpkgw6p5pEP<>IG%NI6)~{d$z$td+@c#ep@YrYY7;#~j zr4Y#$h@o5c0O!+8!g))&`R7cq=-?TOkBS(<;5Mb_1KRp!Qai(rsd_H94{n0NDC^p| z@j-tZt*8U@#V$0|f}L#PbpYDq+rN)7a@XgUks^DdZ}Jx-zRB={QqAgq%fa?cL9GyOk)r3k z9>M~bZhVhx_lf8 zUY4G==D^~))DHjF)3N*ESd}BZSy*k|D%wQP6^jY1PdYnh_cp9R92~dz+{!cu&)eH_ z0>_RIs0s#?`q19Cj6<5rr!4%BNynpW~a?1;0>$5S!V~LF4aQZ1{ zPP2maPVf*-WIgm|zVoB0EL(`8;Vzntb|5{WL3rCKuk zoG&T&T}@r2ry(_Sf`rTG7buHr#Ao@EM};Yg{%!GS%NeQK+Mkebk|w>w_x$>Yyn*mJ zEL@KdaX2Q6{c>jfce*fJeJ2MJ^g<1E4^1MF_&{Ws-I?OEh~~OZ$~}L>u@)R@>g*JP zO6jvL>K2r~8`l*4ZMP-!#nk)m0ulDvspdCPjfPDIjK}svrCkGDxz&kP4S2!@Ows&v zsF=CY_%DOK_K_^c@v)K(~>av0cCVgu7D|BYcmc;N6!#J}oM0re?u-B0TiB0QG!d7nQ^8iOcG z&6_`~-3VJ@lS(Ga6Su2l2yL28m`^_w7-&`IKizBz3pG<}_fWC|v%f&&f(K?nnrmd` z6&>E*pG!&hHjWD$`Nj8wB(E?@K7s4Q+2NcRczIeT5cOP~3H?M1M*{qI{IN8fRAD5q z_L|o|QvjFry&r#R>Hn~6)rzO#*;(gtXa*s5@-aJy9OyQ8BjgV-g8U@~2CM9tmz7-F zEafCOOgQ1ZIO%@x^R+hC(OLPk$m_l+u}6kP5{EZYP)8rg4z$M1{3iH$1v(;l%PE*^ zMBw(r>u^!}r}fYC{((?}TJIZ0)C9FLZ7k?{ZsJJnx&b{hs4L>AKl-;- zMPM+fT#X_?b-#6UJ zH}zFYQsTw5wHTV@SC0maOxEO2jnaM-x`=M!PmGuD?D{#!&WZ|Y@pm;V$iCi+vQht5 zqkAtpn;YJ*Bxw$#wDXB*=_hqPaL7T=`_zWOx^vfB_@B^U7MK8>GM56v>SRVDX1y%cx!SX13 zuo$QryzxX2zlze+Z;2_I zt;023dVez5s!tAW=+1MN=Vu9&1$)#ILb-?~Z<71v5HsN9C0bkq%16d{{Weo4_jrv1B1O`mC+16K(n$yv?WeCAJ;w>v~^}NV7y(e zVPdDzAAd%X!}Bg|o1b4+Xz5H{?brNp24zcb?CUI49@ss)GvTJ;_}X&P(M!$+Ek9 zvn7v|k?z08ex$?e=DOS`1pj-VbY}J#MVQFRCgHtYo~&MZ2u$UGGB1tF1dMg@Q0(qN zoHHO<3BFq;nLE*VksLSY{TY;(4=f*7#JSCoI%RwNbE+>;HLIsRBY@7q{r}j23e2qZ zLT&DrlUy_Djk)Ki)l3b7$W?&O`;geIfI;M53bqR+d$h?i*kOehsWZ!Q`}{{ z(CbR6^I8(+6kfg?nCCfcC+p6?xu%-2{10CqAN|SmyyGH(X9vxqIeQy3tZOh0eISnV z)28O{yZc=W`f}2o&%Q(`6e$t)o;GJV2dvkDJf$ZT|Bvv8D<8YGZ$VUx3P|EJ5$Ot^ zTTxlOE_25OIs{>X@NtV6^x{&~dm7cQYLW>Ry;~{E8O2>*KQzz4&{9?A{#X~aEWETCO4_atvRUO ziJ}DO;#@V|iJS_RG+2z~dtu^oN8sTc^B^Vaa9w^La*@>Z-e zTlAmY*+6S;I`$RXfpV*m=NYsG+mG>V1TJCj)BkL!;#F>{C-J@@Rins8n&)O;3?=uo z;R2)9*jaVlFOGD(&kE-D+h}+UE4;q>`X__qlcA^9=49GS(|ReIw_C+0Bs_-MovaWU zmR5ZgmcAGCc-<1X%4Eo8AD3cz-1VVs-y*$>N&ke+`2-RM&O5d6vQz2Qp7wZsZ&1Pq z(9I0xpRI-TvyL800nEv|`ETEcqbJHI-?6Oe9v^C8xkg|g?iENoj|XQ&UmqaXxS)C+*chW^eAo)ERpdJyoA z^6_$Hd5}1mH;+e!?arRn0hWFS?wZ6xk1C@n*Xi?Fc`I+$(OE2*nZq*uA;odzeDaX` zzn0$q-ihhTYLU>#gRyzM*;z&*7kUgF=z*+e=$VG$!a*XLr)YZ9yMVFk6>U_!Z^o=> zKz>S}<(C9G@mT*94(FLyq%CKInLx|w0P{zAr1pm5PYSF@NPSjAEX_Tl2WmD`TTV!E z0WX6N2SuWnis>QY`E_>YZMXB1IUK?&+w0m!`EI4ttyP`#1NXM09k&b;H&t&pq)gD* z5|s1d2Q0{C@dpbtx2%5SB#Ot?(3k;co%6*+t6T?z8B4Al0IkZdVJ>#t>oIr(@tFtT z0C|sAoXOUkw>==Q{&zs)zGeAS=h@VeUUeV42tfg*yQM&%=;RSK=#=vPlU@2VvxozF za9~5f2kjk+WEZV|@N1rzO<;2O>G+ycxy7-=yVq8JO0XNEW9@t;`#rQd8eLgPd^O+@ z2M1zeliqUre;$xJ-N<0q?IT4Vy3v&n(0UQ2Y8ZrH_q25^>go5-l*fFo_Dfo z(LG?Q%C;7lZkvY;oF-DHgEpoN92r$SG)ob6+@wA?zJGZ1L3ShFyFwAdWw!>9rsJZj zxU6IWFAJ;A;B}#`r>6ytL%1@YJaGvJ%?IF@L_(9Eu@};FBTuib+*i|YaL$60gv5q# z8E{r3vb(?Y)_-uE}`;5%j?QYy^u zAndc4w(AR@`^fWe4&pfVYO?XC^&ZjJsA+QB?J|#p9lTlR0lPUVEoM&Uq2}cYOhaF* zt9bhTpIsvoS@gRh1R<$~GuDGoH{K-+8w9=rsTqgF5~i|DaSGcfhsJV;IbWdS)W8X{ zpB$KPG1{7IjX%g5zyGyK8h!TlAJ`a^|3CDi?Cu?HfUwF{JBtn~hb{PE!i7JsstcPX@0l;(#ahpl|^9=Ggqt<6a*g2dr}x=|wcg~Sf` z{P<5JF>nn#@2v?&F<@*GB(M=y4|vDnq0%4E`@wE1bEO?q%^?YSN;nk7}i;5~WR_ABlY3P*=(>Ow->((up9olnSHRdwY0 zpaVufQ<1ouR$=k9msx#T*XHi?KGXnV7?h;*#9Xc|SstD{JjZBcr*EG82(@BZk=$t{ zCUm#+_2{Kay|>e3)T7}I^ck8t*{eE>;Yco39t9mfB}V<*pK{H|<5Mq-Lu6bFPjweg z9ib#Ev!LpIPyj=ku<&#=EOA&m9B!$Qq; zBBDw)%0g;CQ68=wutR?Vx6isyv$DPHIIgHsa07ei-y#D}zTQJQQh!6(tDh7)M>hJ+ zJj~{V+ozULZ@jerVX(3;%7iaq8^+%?W=89l9+29bnN9_SIi~zr(RQ{mD zuK)>-DL~EF#ssNE3-B;DHBs+r*Uy`f>~k4EdP)NYp?)D z^XBp-);*tC3C9^P9}Cwd0O)-;aq7jg8@ZC}xH(l9${QR`;)M?1Ysn6?b@shsPidKt zVk*69Y&lE{QQ^LOD}&5O-fO{bBD%nTZcRPb6a4yA2O}_ZQ@`s~)Xc}c73!dxMheKk zOT#)!cMBakbAdxjCf*(d$L=PJ3hE(4(JC)Vhr&aJomqZnfu@IKo-Mu}pz4BVjoJsAX`@eK{#eku@2|@Cm&U_q-KK+q zei0(|$4j`v|93Z#-A$YpD|z$e(=4@Mzhes|#wv)%?t&tB- znnK}ipAH|RDVm~-SPqo1c(WSBC3fFh439LJInY5c&BPqRq1HIGtt!|N3DL%`=*K&v zg|LTQ6lI_&J``yYqb z-E?_vGRZAEJIoAYU`G=KO*{q`8=^qI8}Wlc^eeBzb%hDO3`;%OnfTvw1bTFwDwpEbGE!D|LCDLNm9=*@puVRxsFt!<>~O5Q=#+y z)fj?ObmK={48VM1+B~Z<#I&{wZK0f!y*yD6sq+;KtTDh{)F5_?&RwFcV1gO-X2qJmm5XU&%ae26Vr}%Wr4?X zk2SE;*p$lZw@1?E0*L|b^;&6=wVBMC1gmX|wZ&J|s4;9WqtKYE&CHDWS>S&bskdoW z-_~y*DBG-v2r^NAe0U2a1+e01f z3J(xi$Liri@L$SYlSp3o;W0*K*M{$gijLv*QM|PAgfT79k!$Fk+T4nohvZFO|C!2a z{jB=^DU|+k(q8?%GkbEmSAf7H^U3AIa$6)$0JqmuKYB8FjJ6QEoF(554lhw1k`5D=GA(gahTC`HD9UD8A*YnzTr# z4Z0@xbjJJM&yqfHtoPU)Fo>C}jpd1@iA$sS8U=xwOck%TGI2yJp7TR$mXA-j32{L#ICn0 zWu?t)pA2zMPD9gVik0<%e;a&wz~>pUtjb~O9pOcMWv#1r97WZ0h&;zpOZirKkc{3O zP|dU@aYc2~Lr)Vm)ym7J!t{V%E3^6NN%?E3lyQbWT+fF^MpavGTeqE1U*kf@sdsx- zPwfJY!Ai;vwk$~{UZtttxHOeaZ*c~w3?}H& zE9&PUZ18RpG${gp?7%|&9E?Xu9S`g6hx5a(cUx8px@2y=U~zdnv#6I|^DHavXq)&% zAA5e&yYIDJnA6WszYn%6PFiL(HcN6gZv2%Fua;>5@@K0CY8_sGf1%Xl9Kx~LPz9gk zYj1Q!{4RX|C1^7>w3PEpV~!Obp{DIq>X6QGbRS+GZCKf40jmlQLfKx_|v` zj?-3R_&{>Y8RxAW4=R1<#QV}2E-4$}jZdp$|2)}Z)u&1vA``E8KCv**5-(#YB=y%w zOy39atJw`06;nR~XUz!$=L^XFR99c{jgK&MKm5jLMwV4nSOe-A&qNHaau%%g*5D3a z)Dj-}OMLvc9DwzMPu_N86JFujLJ25fwz8Pk7D*ja1XJLWE z%AuO21HOLDbg(pYTGifTcHhv8f|t8r14|mvG>a=3geOV{N{-&ek_R~98XOFFQ`7lu zdVK_CEKs%ULmbCL_W!>YjGbi?;rtO1FJX)1BC&Nz+%cb#c*r;LK>nJ|b$J?O=;k~l zCrbgWGT``+7JaQ2(+#yhS|F@pA`##f^?x0QDxl`>Ai;|`WKGAcy)$}#xMn(&`{Nqm zL*u0o^G_Okd5Y>|E>2Rz37w4lxJV#tD}g`yvG!rf=1_Z``ub2S9Crgi?^oO>jt*9< zPR2@tCxjW1=Ns<~R!7d9A18YXB4FG2h;9G&lauC)-Q9PPGwj8QFB2L)bGi&8o@u&m^pL9xXU94bE20M^OjQ+!Iu)l{(yRa zBILANV7i#HtuFSqtSWeqmB!#BjxHF{XsFLz_`qR7K$uub;CA(5`zeoDC3G3%>(FuS z4Jbfu6nHTQ6{|38Y_)$Oc1As5(1^P_$gmGHS8yD68=uY_gv8mY#F!B#&+S2dX@Sef zbMZShihba9zu(K{1?PRQgFjnC?EpaOWeeTq&yPQqYxh2OonbMJ!?dmttFG}V>{WaZ#Jxdp<#pf$%4#+}Ma&I^m_ zqX@UHq|NEt>OQ8^Rb}6*pzl*;SobA2S{vs{T#xg?agXp@rY!#i+c#D8z?k#SmQCnH ze*^6OnMAExam2vgk&)WnW+%upAL1FRHX$7;kCacuoVh+nW7OhKT-l>stY|Kdv8aF&_hHoh>ETdTwmUa)87Vj7w-`^+uOh_p>%(jC~>EtB7HN~J{2E{+g zi{~kMd(o)nO6zCq;IzOm{AEib zJG_y@dwK44t9RyvEqTxpr1CZshuwM7lY^N6MA=yF17+)pk+cjSn?_T_yT+~3Hqq8O z>zyLLn*Dxx2T=pcnB`sEVLY+`RxS9tAnueyOfV&!Q0LG%j)52zwCB@sEMxqX194g` zdfcwO7H6K+m#)Q7sZbCtoZ{Cdk2)oY6sxoB&keuaOtQq5uDH%6#L@x s7}r0iA90)Y(mDShJ1hBrItF?Hn#strjSlgizBG)iw31YTgwf~!4=)USvH$=8 literal 15397 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 diff --git a/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivar_cmap_call.png b/lib/matplotlib/tests/baseline_images/test_multivariate_axes/multivar_cmap_call.png index 89599461c3e684466068ad2b8f1819c5f1ee56ef..3941300a3a29d3ffc94fc29054a8faf74d563f8b 100644 GIT binary patch literal 10313 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 USB71d=p)eAF}hdx$De=wFAOu=u>b%7 literal 10318 zcmch7c|26@-~Xh$TN`e7*+V65M99uiLdceVuk1S+jcrguWh;{GLiQ!=3}Z+_S;oH2 z7-NYU+l+0~(!0)a4T z+`Ib#0y#eK}eCNNb~n1QDQ4F2eeJw*Ev%*)La=H~qP{8RfUKF*#V z5+Y(ZMQ)1N**}#OzbWJ>Zf|cZ`B=h1R!YQ9{HFM=n=&`0h0i;|U|v3QqN48q+%Dqz z#8I@TBHR#o#0jr^W| z+pUPG?B^exj6SJU=pWV&aMBhdBQBA^b`YO z$pZ!kfrOUt{7OGOgJdZ)f+y$yy4rgLJUI?I2?LK1hEN7x@EH0}6UhHrlh^w?kO>zL zkKrPtVnZ{t!ua^Vn+9$x-_6mNl#+7U*_baXC|Hr_%`%w`!b_$lK_KBT88BZ;%xg4H zafoclGyO3bFQ`@hu$iH001|KvizI}t{|(7{qnE|;p`$}nW0yXeEaUwc*$B6?N?%x9 zMAH-lcQF3MeJQumtngDDeB(+Gm{slia(mnq;_Zvsz-qMwE+r)|Qfd8c*)E-xm|Pi4 zAKkRsTX~9jw5rG$;t`csI%Au>DwK&bND5jm3rQhXM|*CM?l!FtTBQUHr89;c6bQhB z+_u;y4<56U1R=_|KPrpfWaO(#lkv_jDlSITFrA&9=>6XVxvvm$3YO_c!pHHq1mb4i zQ!At&+wEDJ8|R(5qP?vibm^K7jiazWJYk=$V>cV*Wj`lgx4uh+;umna=F&Y<#XXG04DY zu1nwDz0}3k6@e9&*(^0H8pbjy|h2-=GEjjsTaUmcleMM49Dv zjkFLB_YPq(THkHHWLu2l=k~cuA0dAM!DgtH8^xLKQ71M2g~hV zMmya#vTa`s$*?IbD!Se@a1?0y@EJAhDCUK8N=nGKV~zBLdOLBgL1(8~O&jGOp7K=# zLFp*o(_sPqhKT~S{I)PuOrz{HxhzR%JorIABd8J9cEA6nKXGV*-=>(hIO5u$tI;?& zIzC=vRBT*WS@}RvP_S|C`Q%Hr92YmY!HxL=BYpiTxSVp_)VY^#4RVZ?^b0&?&CM#$ zm^c2`*52j#$bIukP}{FB^!>WR!XH}LhR)+Db zrf%lZG5W)BS1&JM9x>nET{9TW*X0jCsK3+Fvp?Ou+G}G{;OSj)SvO}9YCh#&`(M(L3-8esC0LoxqEWFAHc^1Wq10ey zV;ZD8?C!3=$W~T`J=2*^?6^W16tqDLE!HB^^JePIh1UW}h3H$`Me7B2I@cf?T1&vj^%{mHt#)0s3i>0#1 zUM5p0ql0(-I{~?nC(o={u0=VpG8R*+qvLnhN{Q6>b`6*pO8@_uN zchPNCdU2yAk|kZpna%FPNTY}bv2NC)e(Raa)|S`!wj}D4#1@gwc$bKM zqYa6Mm^K zDcwF?U8E0Rr^xv9@;Dp0@0_>2{j8jQN1++gxBhC1;I)(-Se+KRF@ic%)ib*Z9~~emBX@0d&yr_nRjRP|ra=%}!I6V2 z8uqiZafsyRGqhEGX-2 z)w~ZMa{JBqU^FdKY*l3Aw(g7hFlNZrLxcA>g@h<>^s3bFQqVPyJ$x~oVt0-*GH=M= z08uUS83QjlTvJmMwp7u+lMaS_2qQU+`TR`)(-c!(=Ng0*k{tp3QAk#g*MWLwIQqmu zeaaktj)Z?L_L;Od3Bo4$UveJ)lu2_dJ4N#Iu};eMaj>S0Sz52IaR<#NngmFV1jTK_ zMYoz>k*pWSELZs8y+{1YexoRtZB0!Lrb@ZVuJOwHz5d+w2K2)?Z?i0_MU`c#YjBd- z``5K_bxq}omECh>qvnemRU+$U%1xs!4D;hXD4|{(i&bKP`)r6~v~L7Pk#Pq@*XU2= z!%EVtCW1I8XAj`noeb%&Uco@vo~+y1*(oVTW^eHrOPI8{h)3=IH~6mbk-mJDbZ?tY zkrJpv5o;f%H(CW|ILdyevx$^7Z$DEXf2P3799e_deaaQFZhRQ&pT{xq9!Ke2%`Gmk zQ&TrKECA3bCzh`?l0SIV*9M?b5J>Yk0g7^Ha$ez>&m6g1auGJ(wJ2#fD6{NOiZgHU ztGGWfINchxufrM|b2l(*x^!$etG&g$bJXwK&Z}gUHvb07iho07O9MF{=7A(svIJDw z3qv3n)?;#iJuJs;rdT6p*^EN=#h8?~&uR3pBtQiV?`;w2p&qEIKWS7Vk$4FtDX>!~ zVduXLmzd==?(Y;&f2)#cQ@>xQ=V~2jF8_3?ceKJ5(SgO723BRuQm#565HeF9e5vTT zF;ZotK(YjOPRCYCKNX#1W^371rG(wlaTxyaa-CD-wb?jZ_vML+X&1ipHi9$yg0{So z^qm*z8K|?2QbfWDcsrus>!7CiUFx1?*NhalxbDH~hhqQdJ=@ft`)K^gz%|kcc*!>0<}CxG)__V zf4t49p;A2yR=4>VUw4-G_I_01ZE~z-c|2TZRh*KN;?cnk+#bpUcwuPbyLaTV+0I*m zSWC=~r^JxwT1Z~t-X-!@cd=lX$xB?0d@?F{)@ilH^;>)-iEdaB2Hu9B9 zv$HQY8Gtdc7mTI~H=TOVTlo$d1?PiPlEtWh$PA+IRsH?(f*DfKZ71uBTm8vPz!C3( zoIm;Iv)MjTY9jB9a<<~u^&YhsiQz{e;rVgI6X1g(|FBNLeZfBuS!d82o%|ZRAAeiH zR$Jxv6CBBNsh-2wboqUqQ(%)gfRDxjYf&_KRcmLDq*T5Ib?SpM4du{RQ97k%!*kuK z`@ci6u4yap%4jBi&rxyvXOE=sR4I4J@O_O3!sB^tEC_8RVUt&Jf1@0M{R`}u9~H*z zw>0LMX*B;i=N2Vei#e7_n77D#V9sf~s?$ED4$lm}G8qH3`{JX9QeCahYY9dOr+G>0 z3cJa~Rm}6G%VX>LVN%|yeEkGAV2#!D`wnxa@(tI0!=<+he#M}PHLM=S4Zh05?k7?a z@~jmTk;}VTc$zE~_Y{rzRvTB}+8BRQ+M;c)%J5>5T|-OrB7ryR$BXrK)ef(%3*H@G z8MghcmL79s{3HhvWYZ}}Z)brymy9nyJ}u3#ExPOFbQ?5bZ^B?zr(G=G?rux0?cZlp9>O4*dk&83^R31el-%^uo*bqjiepaMW82rSzAp z3rZK)Ph=bVm0v6lnK4jaEGJ3s=%|fNz2rI}u~V52a~m ziZA&8xEB?zM=ZggPKA;qwE1BIZiL;D&x<}2t>7Sy?TQ1s#vQ)9@!r;3RD0da9IrKge)B z#${}b@6uOVSZac{p9uba!s^KnLAj|HXB2usvnU5o%ah4$o6Gq8WC_QGUo&wd0KEL0 z7nhcnX3Va97lwPe2^l+0G}ILp7WT2KpZl1S!rh%NuP$U<(hGQXph9Hk!A3r} z)btrSYQL*wmff4zyEFruf0d!{gP07z>2^h^66nc$?YtWdL#f6qrE^ zp=SQG4L?h}RreXB*+ZegXj-;K-AoC`z(Or&sw(6oV6_cCQXE_&EBN78kaOVeYa+NSgHaa-7evox5E_3b#pfLctC= zLSx3$9j&ByQfYMex3A$cv2SzjBG;R$PA84D`Qbg(%Snf<^H`B|>7;+wU&LDXRKSAF zvHVxZ+hce}W@OWh4RSbag7o@gKWqM(q#6I9FqfNXk+Y74R<)Dh7x9c@t|MjLzX;$G zSm8S+w>I(O#F<;RZKnZ?Smrsq0M@|)wt6obVl3g%wPGi^RUWdx7_gzP)IUHEj h z766t_RF^&eMVH&BU}GR>&@Fn)OL5Q%*(-?A5A%FkxFghWk^J zO@PJ-(JRbY#NRL;w)P`oql%Ot z(aVH}lBdS;+DUQo43IZHS9|+}&Ut@h1s7Je|GIMxl$>x`yT4NulZy%5>bQA2 zhFek-K(LHCU|f*%A>hEcl!6;b;oI#@{Lt}{ZSduPUcr?d!oy#Xv!FTzf&2kE2BgEl z=ZNw%=Fywl2I!~D{TYgZdpgH}i^`&E&zMd9=07FfvhO&{i`eMn7JK|6Pg~w%akzB- zH}}N+Rg5|+TVjFK8OXQE){T}`GqGMb`V=2=u$RvPoA4(&@9)sKB^;uO*BHJZ{jp*# zh|iX-6)drJ2ZE)*Frqi%DFTZgWmI$?U?e;ZL<2aGOQZe?37r7YTA7&z`YWp=f_bQB zgpjLY;BsrWT7ve;Gsr+qys(`wu#36@4t_%%i1y5$rPigZSJHB)r-K>WHUDJl_qM&_ zL|YhwI)H>YOM03Wem+t^M{Pcbpv`5Q=Un99L9$WsW|SqDC(w{zT_=9S8jW0z&d_xbGP=yb^e%BHV`{l0IOTfbVDcXYyxlz<5L zlXEkhxDQVF1t!nC{kB{eO<1HiWq z-~upS))Js2=2Z?c04&m`UlXsnr^GuiG&AxK){!z6|J@Lvj*$SBQQTW;si)L0ZjAf% z6rxb3J|yfAxi4p5hY9FTS@bTj1UP|3<553<84!_xPjBZT!%4WKEzY>nQ~#sd3?k-U z_3I(d;lkaj76&vyZmYYqU*vU9hvjwO33C{ooi+fb;{mX`6yPHvw+h@=vZ5>MNSPn& zIMU_~)K)az+5=kQWj&leRq-NkdKwWUM}gSW&4~`8+_!?l^K`kIg+lzd{W04er?_m> zd0BOR3W|#j{QdpgOn*x>irq&iX1LS%0UqQ>!G;tL<(^0c=otU$a}pXy+wXU9O5mOr zF6-+4ddE76p%VS0^6twWMkWb>9XqB4dbf>k-Ut~X_>Kg;S3w{!fDWaY%F^5n1hZZT z&<=+*Ouc!VoD&CIEJZFvOJI9dIjnN8WClGbd`H{53VKjhKHyABUU@A5hBJN%kcjG$QDN3uP8Iqn zZf@?u-rhH2>?gw&x|@$n3r)yPezwUxe#Npo;U%ZY_T}HeNbRohrSAKdcL&#vID}N<8`~Y4 zTq?&RuM2M`{wvQCo>@{!qvDM85kV$9th;p zN!ZyBXlkQ{XyeNB#;x8Qx%pqKC)F?FQ2wbv66|}hP1;T81MC;d&<5|-*Nc^>$dn>> z-3fj(+SeDP^>X4$`xA7bg*FFkN!PDm|5t8sEEuNP=%ZWLHGXlEXteElthNpW{3wG>vP>hvApti2_Qi^FZ%i3xi#}k zf9tmxFr^@{XVb-}IN8|PoPV*}?=0A78ebhOBOYubgYyCP6VM{U<;mY&fgxyeM#Ms0 zOxyfgdmkj8CYR^sEuE5Rw)xEkTY@o5n zg$db9-WaG@P~{yFxOu%DR4@+Rwe7!k9z@JW(qu-v8s zx;xf0->1$GNStqb#*SQtfyvalxO2G8+bsBv+i{~Cw~^c2s^fD)XEyPr{Q9x*k1PQf z@AJbT%2OYe)hC3mU+-s<9?x1VL+gOi8l;N-{STT37{D>A18l+dEHK0mwy~@7hj``{ zt~w3=3n+6OCI$OUc!nMR`(m6dI}LH}SJ zncVv#KsjD*Dx9~BM-~sv=q7<+`Nj1t`FO6Kcp=`i$x1-&+$W&S!7JHt2V~vC?CbK9 z;5(C96{cgAL79ecw=eD%wW~sI7NvpvY@5kPk87`nQ~7RK?Ytw-ANle~s~UNAA_c<| zpl}Wu9iv{-#KQ?lHhjp%u!&jdycD8$xz=Lywr6ehF@Q{DE2~f5l9pavrSIul`BF~Q zuchrrMGQsrd=$`PT&Re!nWvzs`aovTV+PKP@)p28{=f!OG5IeZIW2tC=bACN5_|{n zpCSUea z%MEc{2|r@rF{0b{i|mXW9}56^f4*b#;-HU=ZrvsQo z`EyUG^M7n3Tu^L$g1MaG)sUx?z5svif8#eZH`3OQ(d7bX^v%^?Rz0ov&`(-r~w4`ciIgh#4_+c1JzEKeKgg1wj&XT^3EwLD!S!5EDUO9 z)IrdqS?YRO0-s+;MM(meyHg}PsfLG_+y7tPhF$sosId8m&wxUQCOGspzv!NRUb`xF zis>@WNA#loUGv`s6{o60X;m2lR)m1h|De$dw6CW`oeuW4cYZoc?o4wu6~HI_+o|us zhG3;}DjCqa?s8bc-VQfyDiys9$zto-)6CC&nvxN6;Qw1?f)FcS%PaH&g%JynMzi%| zb#ladoIU^)fB&fVKsZ!2u8NM#Q&Xjib@`z{`3PVGsDhW1uYfAbwTye@Q;vu`fQjOB z4_Xn1fw+6_WA)lR(jFVKD&QDaIN-fg*CgPb7H8ks`IX1J>obwiZtVdwwTiX6IaqEeImg3oD`*GwVVM0RKO&oQg60u)CM+^ms=?)YnVdTb9H>s zw7XxveIN_841KO{^heJ)Y(P6;DxBk%Kd#k<&o3G((PUgaQqtGTVY38xIqXp$=+S_~ z((9QBY7#83LVCt`Z9??svz~F;R$-y4RZ70Eb-9k|KHhTRLL=>>S26b>$``VMDsvVi zf`scK=N17ZTcCF*je#o2>znd>5(8q!O^bZ=-#3-4s* z%j1P@*T=Rz>dh14%GczXer3&VNErI;aB~wRjKovefVTWoW~lXUrqPv|^iU ztZ|D(tmufo%1)84{#&S(QFig=Byv;mrh#C>Ffry2a147#<4_z06w~Ia!a|LfKeq-x z$9J{H6~$gPmgz6TVs#P|6MeNB$hhMMF6otUph>!kRb%Rc#F5mK&}8bbNU{>>Um>YQoPpM@yarPtDc^2v6*5R8{)*rWogPsmT;2b9C2j!_Pd5SO^Y{xpl&YG=ro2W(_rQfi zox}gNz*sA|sQ5R$D9d?a@&LWsU_VPH$LGY#X*LD#IEUZ40Q`W8!vY>zjyMlK@chwZ za`meI{@WL#uwb-+F!Q?)gUA25e?$3U$@ot~wq7~aYoxxruxZ(Mq_#VTr9}ikfa;y9 z-2W?dJi~vLNq5elGApeJ6vV89mT&aT1<+!KGP-F=$YDRJBoiRgDx@x&GzH_T>fY}M zhhJH5*olDee!~*FGrEsaf%tJe+9)+`>yqyxQ{2f7CO&pDTG;p-#Uq`0caPySaw#rk z)h>fAgPlCV)?I$kimsb5#|&51HB8$-I|xw}?oFaU`UG~G2Xq=4Xs(cYY9i-fyHX&4 za1ROPdv}^@RCy!C*5a$&a2`v5_~ZQ-YW)D{a_nYZ0kjjmhbNL8mQj5`0Mc|GZ^nOB z5WwvXJ$G|mTI zE*;)UPi*qnsnL;->ujT8lw}WgU#;9H?YZu?Xzzz~NI>z?-CuJo(2jbHVt*lAN|H~U zPhz}OlvURu?iBnk4S54!)sC`+h`+ZjyXR<_T8nriphWU%73SlfUy62iorzuY`IJUy zwq@V;Rm;I0+}^CqW=`T81Ei}16d#n4&yUW;BV|Y6I~iX6bonDOM{0ml7FBqcQe%x% zSq|7;_Kl2g&tWz3@qJzCGkh&#FeX7u-j($3a{U}jXim#%c;ipV2`jyps zQNn#<>^h#Hc`U=ifCU}u$j!qer~%*8rL=0ZAJqTIam$sbbFSHCT%mKX+wo}x_~yf- z`XznWQ-Wh+Vp62s&9@q_{dJxZ`%HR#cP6d8?x!o`Kf8TQDRAu}yyRYDqb4vsh;b7vU-aSCS zUEbVU{sHW$*^>XPbZ!*bt3-G^{q6*1m zpWXHvRS9JKgS?c3!Wvwo&LZ_)}`zsZ8c*BU7H3Q`A#ed%OpDgU3EB{gU`?swRf$jfpKUyfAMNQ%s U44?Ph6C8nts?OcAI}e}#7w+it6aWAK pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy