Source code for cachai.gadgets

# Basic imports
import numpy as np
# Matplotlib imports
from   matplotlib.text import Text

[docs] class PolarText(Text): """ Initialize a :class:`matplotlib.text.Text` instance using polar coordinates. Attributes radius : :class:`float` Radius coordinate from the center. theta : :class:`float` Angle in degrees (0° at positive x-axis, increasing counterclockwise). text : :class:`str` Text to diplay. center : :class:`tuple`, optional Center coordinates (x,y) (default: (0,0)). pad : :class:`float`, optional Padding value (positive for outward displacement, negative for inward). Other Attributes ``**kwargs`` Keyword arguments of :class:`matplotlib.text.Text`. Examples ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: python :class: mock-block import matplotlib.pyplot as plt import cachai.gadgets as chg fig, ax = plt.subplots() ax.plot([0,0],[1,1]) polar = chg.PolarText((0,0),1,45,text='Im polar!',pad=0.5,ha='center', va='center') ax.add_artist(polar) plt.show() Methods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ """ def __init__(self, radius, angle, text, center=(0,0), pad=0.0, **kwargs): """:meta private:""" self._radius = radius self._angle = np.deg2rad(angle) self.center = np.array(center) self._pad = pad x, y = self._polar_to_cartesian(self._radius*(1 + self._pad), self._angle) super().__init__(x, y, text, **kwargs) def _polar_to_cartesian(self, radius, angle): """:meta private: Tranform polar (radius, angle) to catesian (x, y). radius : :class:`float` Radius coordinate. angle : :class:`float` Angle coordinate in radians. """ dx = radius * np.cos(angle) dy = radius * np.sin(angle) return self.center + np.array([dx, dy])
[docs] def set_polar_position(self, radius=None, angle=None, center=None): """ Updates multiple polar coordinates simultaneously. Parameters radius : :class:`float` New radial distance from center. angle : :class:`float` New angular position in degrees. center : :class:`tuple` or :class:`array-like` New center coordinates for the polar system. """ if radius is not None: self._radius = radius if angle is not None: self._angle = np.deg2rad(angle) if center is not None: self.center = np.array(center) x, y = self._polar_to_cartesian(self._radius*(1 + self._pad), self._angle) self.set_position((x, y))
[docs] def set_pad(self, pad): """ Adjusts the radial padding distance between the text and its base polar position. Parameters pad : :class:`float` New padding value. """ self._pad = pad x, y = self._polar_to_cartesian(self._radius*(1 + self._pad), self._angle) self.set_position((x, y))
[docs] def set_radius(self, radius): """ Updates the radial coordinate of the text relative to the center point. Parameters radius : :class:`float` New radius coordinate. """ self._radius = radius x, y = self._polar_to_cartesian(self._radius*(1 + self._pad), self._angle) self.set_position((x, y))
[docs] def set_angle(self, angle): """ Changes the angular position of the text around the center. Parameters angle : :class:`float` New angle coordinate in degrees. """ self._angle = np.deg2rad(angle) x, y = self._polar_to_cartesian(self._radius*(1 + self._pad), self._angle) self.set_position((x, y))
[docs] def set_center(self, center): """ Moves the entire polar coordinate system to a new center point. Parameters center : :class:`tuple` or :class:`array-like` New center coordinates (x,y). """ self.center = np.array(center) x, y = self._polar_to_cartesian(self._radius*(1 + self._pad), self._angle) self.set_position((x, y))