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 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 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 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 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 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 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 zcmc(FcUV)|*KWjug98jh8@dCcA_CHp&LAKtARxVs(tAlDv;-JtK&b*E(yMfc^qz=F zQA((Z5;{tNKtc%w2#|ZC&ojU8e$RLBpZA`J!`V-=bIv|%ul25Xy?Z}@WTeN;#LEN% zftdC0-!lb)&aVOO!ONF`|Ka!{W8h*4(XoP<`ME-%PXb*)hEE{=-hL2okEd6IT>`-# ze!jAj($bQ5B%NJ?73A)SyFGEb>m;Wj>vGri_EmQX#2>6ICFS$)k0kv9-K5rkIZp;| z{FDEEYcL4J`h)+FQ9Fn^=7aqZ}-%Zx;>j_j+t? zU742lD{4|p^PVu9yn=#fe*NQ{h!&6ZIuC2y|8i_)8)8G!`oqQ3E5+wuc?Bm%~PHhQv+} zPrl6#^>DK9oX4y(x>8@V0lgR5pyb!{U3^ovq!B8^wkb4a$$C$UWO35OlNl_2_7#kW zio?lSdz+3IK$_=DH1$%7G|_XEi;K()SI7z65OMfKdnWMz=Znf9(5sLS0-z`d4j(^@ z(q^%}mbXDU&1(Y|0UC1iVVsnTky~4-EIC`jJ9(Juw|d?dp(!>s%Yt5h^@$fjSA|Rp z&xiKk`T6vWg2Enb;pCsZzc7+5|Ddmre*>_D=Gac9z@Uh2i}$#WtgENn3d_DYkFdx@ zQC0oQz6QF^!rVM#VVxczZ{PWiMXNr^F5|L0u-;18AKy{bs7{B!wPyFVc~j>9M?vSZ z0c!F*(DTn2l{L+LtIpus`T0Z3q|<)(TRgDhYaU~-^?9Xfoi@}Jucm+%UBhg-k68Yk zoSbIY5ngi(i>lJn4_Lcj_*3uSOG--0mUfE0b?erN5#ySC?)lW`mUztr4d?grN+CCa zVT?~f{$#5^e;A7;tuz>di#Ylv#Oh+}TnlX)0%ktynW9@zl)CvK~GxWMfWx`Sx0up?Ydq{2kMuS7MGQrMz8NSntBmW}`b(_U- z)jKRHuc(f19@WA(S?o`mRb+i}3ogp})qTRK*8DcJbVQfPN(-w>-U#PhqhS)tD#D)z z+Rea$|NP(&b%^K5N?F4B9=#$WNj-_U;-Bz%CjEF(8FUb7OK~0334akP*?VMH?|kq& zj?|%}I1gV7wGX5$xNz>JQ<1e&3%jR+S%es9>zZCGycvs*_N8b{LRyVWZ@+&P(P*R* zu{PHJtA!Ry*`G(^_DouSRMT0>_CoxQ*ZX!Xbw4d_}I z!WlV_I*SgXq@=9y@~d(HGyI#ZYa-Hr+Whz%;Ml^mH9h9#)lN7s&$G#t{b{L4YZ2YV zZI!;5lqthpC6npt={RpGDJirPvQ=%>6A9yzs4^J(1X(T>iyNI@IuQ>0vu;?ZkTK&` zrRTC(mXo)Qm5a=nu^Mf!I6j(Q&3KhTDE(-?8n03yp7t#Pq|a+=Q?_E9 zpC+n-2V0*?T*`dqHTygZA4pZ)+yWQkP7#Vs|r$}A=^X}DlhOoEZZ;pLY&Zi~zoTjdO?uW<=o5*72@`^R*u3>`YW`aqbv zg>mfv&@s-aCRoO*3@Y4y1VnLZB<(D0yN59dYY+7x&3E%kKmGd>3;!C_1_(M3%lV7S zFX9Xg3?Q5J1IKyvL=R$Ii($EX$J5J8EyoLUGNhK}Hk0^3ElV%WNF9oF11G72^WDJb z{&`;wUVM`oIhr1N&Er6{VBfp$%4!(cA+r?hYQOr$&S7VlH=>WzGDHE(ka7T(qM)8n z;=>iVy9NLh&94ShNoZ*3jFpd%51ea_TWZ@`P(K?&6wM!z?{|qtM$Q>D*HP_ftYjwU z*~QM??InQ=EiWcq8$nKWGMoytUMXEK2(T2-3Or z3O1G_;dBl(s0Rd6RQK*D@vx&enU7ER-|)hB@1~V5-GCXGrV_hJaQn#9{fz|_3Z>5g zjAD(A-oMti)d)u2x9ofFR-TmdIxrg3y;~Z*HS?z4Y2f%}UikQdt4_nL$?)N^|LmNq z0#ryA?E=%2@yZ>^>whS$0F{#MZ+nf`%-zo$PLviHb-E_z8DJ@wZWW$T9U5hq@l5CC zvtYq9!U{2&`uEbwZ$=;H1SmiC9--^fe0RapDL5s>szHBo-Re*3_(%=eZ@!MkqIr&; z>9KogF5Ri)%JP~3d$s}T`U6Qzu#Rmn3x0{0Uk;!kw=PR4{OR{~Fx7xJK*vUXtZ>PR zB^j!)^=M)FsX*x0)Z~T6q9QG3W@ZnkqDK|D_U|t&$V6t)Nl2Q#10~uCSWDZHZleru zNOahW>Lp{&P^hwgx5%0ysZKlXIF_K3{4C@%YZScO)6+BTrWbu?eSyF^XJKkuTy9x6 zmfOBZ-bIa=qM~D5?y2m5ltoWXywTWIQKR=%d&VGexvkQy+!GtF()_fKX=}dQ7C^0I za=Auraj`JUjGo)ZVu19+f5(07s(t9U40t)+H43?b919vtNKAI^)7F;pO~8@0Qg9H? zXTY^}&UcdYs&C^l%BRclMpQ`nfq8xsiv`yu5J$c`{09BOpnvJ*h5y1px3z9%OaNI7 zvZTYkPBzXj%JJ>cC!uJ_1rPc&x7jW#FG^3!?e|H+^$Tbx`2Epvi5Wyu*jEj~>B{Np znU0|9A9;KGr|P!zg4DeNTFrnEt-VaLLuUn@Evg?Mi)-5GL9AnJQ6)DDPMXm?bbD`~ zhmM^~Q9C71-Vz9Y*`F7%(^DV)MqA!@#;!IZ?9D^jaNO_oAs;2EtbtVB{1T! z>h%U#?%nH+-TN&EIsRp(hN|WEYvcOwb7s3_Z^;M!A_gCn1-jR&%o(Qv%R z40ZhV1~dNdb-UqjuKDK!d{+aht^Qn@GIVcLRaE4E2&F}u{e;I7U$TJ(*$ILCBKo@5 zHkGc=vjxgqHu<0$Lw8Sja}(NPSVFu3630YZsP>7phWX#-^_^_7%*S-K?>&C}_^VSe z{UuM{3qamExfQ@#>N++&)y@uKVU#2{b5o0=xyW#H?Muv4-IVziXc)b3#P_~BIy%Q+ z(C{jkp;zl)ox~x|Cik(lA#C%~h@w3FB;*G_T4W~{o>yO+EKlK*w5#~%3iojyQu?n7Rvx>W-SN%jTC?3a-~@Yt_zyG$l*E(@+>b8@*OqRdQ-1 zGIpHu8{$l4qTs4QETz(E%P->7We_NG`kr@>~dEX((} z?B+}WI<&jH+f@I9D~Dw>b`8iYDFR`(J=@(1dr+RMI!=;XjQRaWZV7OvD{$c&?S)i# z3=3p7V9%4ec#4obtvm{_G3FfgHQmo06vPuOzAFbd!Q82iR{$;v>T8vC3PYdm4r0Pd z6P0Gysd<+o{4p275a68X=WXpOA;DdcZg;1!*y@gsnZ~1E`2PuE9@XJk8x*JWSUSn| zomFzQxJO%zVQmWhX3)11U>~v5r@ZtxyDFLm#<~%5vNPZX)KJ-X zp8VxHlKlpQu|Nlg94^HL0hx3omd|$#H4kaLZj@U=sOvN;^9XxIM}nx?J^{$re}KAc z{adCZrda2Sxw-ip0hM6)zW5A!36>wan&nVHo3?bEUhYdUhY{W6f-Gu}xhRvih??<< zHxJCs%u2lK+RLy&u?zyez_rCB=eD{Gan;&18|>lHW`>4I$x6$Yr>Cae=eyc%nmsdG zeCK8ecTWIBntsbxFxH-FS8`4?=J70|pbDK=Tb1rf{_Lbd+&`kf<5zWJA$LWDO%IrQ zu$5L?RaMor1LOyTv=$#6hJezey{**O7T2w;Fg}Jl^y(&K;&2M&jaegkIk}3WqThXP zb1;QwYj<_))MLte;jr8MV0q(V*XY_|X-tBzOG=}|!|H*j-dtOs1l_u=ERFl_n+`u+ zLOfhva<$w8wcm2NmjQVj7$`#|wi);53H9pt&IORJOL{2LetMnr`h39rSLoHzCBlk{ z<=%z7oPxtFF(|cTotz>m=AuONPE8C_PEIYoSH6d~jvexHs_{uF!Gf7t=-D8{SUd#& z_!;SQy|%o(JmY}It=WMjJ}lvGu7z0%z93RFb@Z*lrA&jgw2y!DE?Ad?(dvy@JXCm+ zTbh7H7*lcI@l)`ka^U>mKe5Y!S0C0|)ti=icy4~KpFzSpE$Sj{WZg!|&hivQ0C%DJF#?QnwwEc2~G1r*^*?^YiE2 z1(&^&awL8{DbY=uNRa9(B-EiCsx#Gu^_7pl>K}iRMX!-3jVad{K|L=ow+^}worKgr z+1pE+C&u`GJ{cAsA5mY6wHG4$A8eHk=>ZI6&;{`CD|-9^e*=ES<1^P`j%)GRd&7EM zs-I3?z9QwmfP~5XtPMQQ)WjsU{4U+42JPuFu`-ZC>AFK}Tk4IYDr*2AN6p^Lk*9zE ze~>!(09#Oqb2FV##6l&#+n^K2TGT(>4k21*We>;4^@M8KM0DL}ni`v*^j<(zCwI47r#tuM(Piw0!S+XIja^s*G%>h@`O-nFXL4-V$)+g zSJXX}RETq<-&_S-1H@8R4f9eOc-)JYxt4j z2W9CdY6D1Qv+tZTK#d7U<|wmIa-x${=UG(?*C)%Vd4j;ZN2zK@vpAbPeq0(S7$=upnc%q&j=6q>4*7R;pTqFP-~do+VU6rOmPX=9lEXdTMC-SbX5 zUCw{Fv`Md37bHV;yDS^l(yXJ++5U+pk!&?CiH?i-URI4MiPqU-*-<5JAOwm8BToWE(=n)$3v`pt>qaO4wM*6?GK93BqyJ3oaT`>HmVUAyap{a>v{s`cfesqY3XUTpB~^iQwGR$e)foliQm&o zu~?e9hM)UbCXy_g7kPH1?gk`pP~oEhMuCeiees;xVPX3{%XVo-8bJ-Qmi(0&;+Ds+ zdFW66V?f|LGk!lkHdYuL8{1U>=;l`s7Tq@Mdd#`F)8h~&qGx_c+>&sAhacoX2~YU# zgHPCf%Hzaqecs0=Zuvu@Kns`GC)ztwxB8Kj-S12r!ygM-ddU-s6)TeVO@nCEc{dx?sHY z5|<^o52p?xA4i}r;e`RHH?NRTSVb2g%+V)WZUvz;J)LWQT}Q7Dt!4`)>`PEQs>`0K?f_{|jolqC;39||w0E5C(N zJA4q1mn+FCMude3GsRi|lK5lhsWqo+^5IGfArp1-CO$s?#E6dYn&(znl$k~=OiIY7 zq{s!59EjsG=HzYbe`?$16U7_=ft2YCKFp-3?r7-)APVwYq$64Gt4saL2+~wgU1kAp z1=0ioT#4TJ1w{WuQ!2hiQG8aU$0ZPZ_btl34^>o4dgw}QN_g3>-jGz}3 zd;T|2lpWx7U4LemIYjK})Y^Aii0CCxogD4SI}iTy1C674fgZV745sXEqZ8lZc$@Z`7b1Z__>%MU%UDe{H9_Rv4quXy!-B?tbxvQ_^_3TI3BSvZPvUOiaMZopu#6(tAuVcOe zj+d7DV&(O{0k|cY$7fWX8VFDfVxdTR68~LO5xvAQK9aXFUt~Crx)I<1*vxFj%#}WK zi$6ohQYYgR5`qX&WC@>do0iV4iS-+n9+Y_twbO}9d7=G0%A~G6AlK2mvs|Hb4M4TI zq2EEt4=2CxFxW0s z*bi{ELMF*UC9Gkp4}~Bg&7~quy;1R7w6@XM8PMM?1##dbPNM^d*pZI7b(e9m%2OdtTlF-`D*{c6&K(%zW zY2^I;3U4kSuxt`Sd^H1xEZ6G+ixUx#RK1(xftBY|7WLXLM|x<;^r8e(#Xh2 z7+Hg6W@)6MWtj{9bNp>~fC$8ST~os6FoW1Z@C7P^qg+wC>B+YR1N0WV_C{6W`C`kA z_%jsLgO+bNXP3=K>;Wax_rhYn7eIE-uUvdUT)(`wHN%aO?j2%DMzu=iwg?dA{x^Ou zJS$u>ay*WWbp5P)DOY}Ub!QO>BMljP(_}GGS|NqoEzSRX7^U#KC9eAm0tNAB>s%fJ zM4t6U^>D~NF-9uvJ4@#Q@Y{KIE}%f>A-A;TF8B-Er-wi!0ck>XWpvq8cMOXSpg`{! z;sabi%^`_p=C9Y6NyM*hr*0o5@db^)N=B|a{SBaZSY1z#cC6+M@K8t~efs)U!no|J*HHNsEBfI{bxzIXxxJ!cR&*X(`7 z-VxHTQ$_uFg;(w^s-rkSK-RShzK1KPSLi>g?y(iX{`Ut2!)p|fr^yxwhuV=G#pPZ~`&qSXmd zPkO&a6^nql8`(KIL3@UZ9$NdC?IY)OZQPPMt3jo0RlRrEfn&J3< zj`4YE^~vnWH#tcc{Sh9Fy*NQ~_XmV*3jlYl+(TIrur{#1;uv@l>5pP z|GI&6t4>tIP4pkyUjr5X@`sx{lVR>W~{T}ng5ek zv)1zHW@&kTn1O_ZgfgL~5rVOHs{}G3sfj*$SIZw2me|tc8SMbiQdU+mpFkiwmi6sJ zdM<`}_AxOFs(wEE9@?NZt7|NCW3#h0LtJ)MV!dWIu<85VCmC#E?wC8>yAxMBfbcv0 z&f-9UOc#~ysM84en~>XOktzr~J?8albwIL%m_M(}wJW9_e=*LuZ$(r19;@4|s>=?A zVNWlj%gU}Z^UWIf8cc9&R4Er*EhSq71qD^s)YRzh>YzQ`-5+UdYtLBSL~ruFRLq4(r{Hv?`-NNo9LuU-6)THWp=c-ei1a58elKUOV% z{BQXwlPlEg3V=AtweIE8iQSWqXQ|g@mki;I%lt@n!2o&V#deQ{3?S6RpUkm|i1dbr ztH{m}BLwwb@o>D>?@;mT9O?p?GY(k5it_@m4v&|n8=KBm)po2-{hA~ug{hLT4}*u_ z)1Vy*)O`KUXIUN<_BJmsKUJfg2nEe4B8%ekk89IDzSI>`GtfBtDAKV}RZVBn48ODa zrjEZlGD>^02f6P@(NgrzU%n4%WbJr@WmLsVv;O29{e zzmgPn8yNMVnU&7)L8SosNx3N{rQtmOUFCSUR5HR#{{nPQGx|Ri`*Py6ZI>;_# z1nzgTse{p-&qyto7sJ)6&$9fwyZxoFPj5ckq*@v5z)P8oCtm!7v_x4S7TfbJK{ear~1t_iLD#}bG}btJr!uq3WVA}>~BQuPY8Nq zbNqajoK?Bj{pBs)D&(nlODsMS_%Yh*=}0&~dT)tHX~d6ljvwS@QJ%9NY=TuSZI!6+ z+jWIK+UJ-7PNEeJm;~5akXDML-JmXCPk_&THBp!li2ONJ2E7uQ6eg2$t@{KCO_-41 z-_C~9_aG?v*r1VOzg!i{JC8u&2do{zJ6Iz5S|(ZoIRGq{u2(N0(SWn;k5big2t=wN zu(O7+1zyynE)?q|G$6}>1G`FVlP!aNYHW9vY@0|AMF!zn=_{}fHk9BLq|lG0;>9c; zSyy*p>rPco&0~H2=L_psuL`F=%_W(mf&SKbx4oZzB0u!f{oi-Wo`I*{}}I zXR`HERPkv6R;!G^kfjxUj!Sa{6n2*Kw}5cdtOF`v`iu$jWX3*&Vg=naICFKbF8&fk)W=6*9VmB0TgD00cNIn zg*^9!poiIl@XRqWg07P2`4KpN0RhoOKQ4gitPD8LY34LDus^?dO+QD$XJd!L^3NYO zC^#$y<>!Z_Z(7o$_Uh3$EK%1&!dmx*G`fh-%9}#{P8LzNKJb^_C~=rc%d;m{_427f z)PZK5iB`Szvh1_U=9x1|!othA;&oioL7;z12jvW3J(jpS zlqrP;X7L0tZ?pFo840_#F_K(V*Sn(@H-85P5XY~8J~0WT9eFQI1+ZU4R8$mR9uxKK zp0KC4_f#T}>|+y?C8)Bd!(s$Z?fZ>^^+ozyMS=cIRiZck59%xZoBt1c(H3dv3&Ld~ USB71d=p)eAF}hdx$De=wFAOu=u>b%7 literal 10318 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 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