Source code for whitecanvas.backend.matplotlib.line

from __future__ import annotations
import numpy as np
from numpy.typing import NDArray
from matplotlib.lines import Line2D
from matplotlib.collections import LineCollection
from whitecanvas.backend.matplotlib._base import MplLayer
from whitecanvas.protocols import LineProtocol, MultiLineProtocol, check_protocol
from whitecanvas.types import LineStyle


[docs]@check_protocol(LineProtocol) class MonoLine(Line2D, MplLayer): def __init__(self, xdata, ydata): super().__init__( xdata, ydata, linewidth=1, linestyle="-", color="blue", markersize=0, ) ##### XYDataProtocol ##### def _plt_get_data(self): return self.get_data() def _plt_set_data(self, xdata, ydata): self.set_data(xdata, ydata) ##### HasEdges ##### def _plt_get_edge_width(self) -> float: return self.get_linewidth() def _plt_set_edge_width(self, width: float): self.set_linewidth(width) def _plt_get_edge_style(self) -> LineStyle: return LineStyle(self.get_linestyle()) def _plt_set_edge_style(self, style: LineStyle): self.set_linestyle(style.value) def _plt_get_edge_color(self) -> NDArray[np.float32]: return self.get_color() def _plt_set_edge_color(self, color: NDArray[np.float32]): self.set_color(color) def _plt_get_antialias(self) -> bool: return self.get_antialiased() def _plt_set_antialias(self, antialias: bool): self.set_antialiased(antialias)
[docs]@check_protocol(MultiLineProtocol) class MultiLine(LineCollection, MplLayer): def __init__(self, data: list[NDArray[np.floating]]): # data: list of (N, 2) super().__init__(data, linewidths=1) self._ndata = len(data) self._linestyle = LineStyle.SOLID ##### XYDataProtocol ##### def _plt_get_data(self): return self.get_segments() def _plt_set_data(self, data: list[NDArray[np.floating]]): self.set_segments(data) self._ndata = len(data) ##### HasEdges ##### def _plt_get_edge_width(self) -> float: return self.get_linewidth()[0] def _plt_set_edge_width(self, width: float): self.set_linewidth(width) def _plt_get_edge_style(self) -> LineStyle: return self._linestyle def _plt_set_edge_style(self, style: LineStyle): self.set_linestyle(style.value) self._linestyle = style def _plt_get_edge_color(self) -> NDArray[np.float32]: return self.get_color()[0] def _plt_set_edge_color(self, color: NDArray[np.float32]): self.set_color(color) def _plt_get_antialias(self) -> bool: return self.get_antialiased()[0] def _plt_set_antialias(self, antialias: bool): self.set_antialiased(antialias)