from __future__ import annotations from abc import ABC, abstractmethod from typing import TYPE_CHECKING, Any import numpy as np if TYPE_CHECKING: import io from numpy.typing import ArrayLike from contourpy._contourpy import CoordinateArray, FillReturn, FillType, LineReturn, LineType class Renderer(ABC): """Abstract base class for renderers, defining the interface that they must implement.""" def _grid_as_2d(self, x: ArrayLike, y: ArrayLike) -> tuple[CoordinateArray, CoordinateArray]: x = np.asarray(x) y = np.asarray(y) if x.ndim == 1: x, y = np.meshgrid(x, y) return x, y x = np.asarray(x) y = np.asarray(y) if x.ndim == 1: x, y = np.meshgrid(x, y) return x, y @abstractmethod def filled( self, filled: FillReturn, fill_type: FillType | str, ax: Any = 0, color: str = "C0", alpha: float = 0.7, ) -> None: pass @abstractmethod def grid( self, x: ArrayLike, y: ArrayLike, ax: Any = 0, color: str = "black", alpha: float = 0.1, point_color: str | None = None, quad_as_tri_alpha: float = 0, ) -> None: pass @abstractmethod def lines( self, lines: LineReturn, line_type: LineType | str, ax: Any = 0, color: str = "C0", alpha: float = 1.0, linewidth: float = 1, ) -> None: pass @abstractmethod def mask( self, x: ArrayLike, y: ArrayLike, z: ArrayLike | np.ma.MaskedArray[Any, Any], ax: Any = 0, color: str = "black", ) -> None: pass @abstractmethod def save(self, filename: str, transparent: bool = False) -> None: pass @abstractmethod def save_to_buffer(self) -> io.BytesIO: pass @abstractmethod def show(self) -> None: pass @abstractmethod def title(self, title: str, ax: Any = 0, color: str | None = None) -> None: pass @abstractmethod def z_values( self, x: ArrayLike, y: ArrayLike, z: ArrayLike, ax: Any = 0, color: str = "green", fmt: str = ".1f", quad_as_tri: bool = False, ) -> None: pass