Source code for data_morph.shapes.points.scatter
"""Scatter shape."""
from numbers import Number
import numpy as np
from ...data.dataset import Dataset
from ..bases.point_collection import PointCollection
[docs]
class Scatter(PointCollection):
    """
    Class for the scatter shape: a cloud of randomly-scattered points.
    .. plot::
       :scale: 75
       :caption:
            This shape is generated using the panda dataset.
        from data_morph.data.loader import DataLoader
        from data_morph.plotting.diagnostics import plot_shape_on_dataset
        from data_morph.shapes.points import Scatter
        dataset = DataLoader.load_dataset('panda')
        shape = Scatter(dataset)
        plot_shape_on_dataset(dataset, shape, show_bounds=False, alpha=0.1)
    Parameters
    ----------
    dataset : Dataset
        The starting dataset to morph into other shapes.
    """
    def __init__(self, dataset: Dataset) -> None:
        rng = np.random.default_rng(1)
        morph_range = dataset.morph_bounds.range
        center = dataset.morph_bounds.center
        points = [center]
        points.extend(
            [
                (
                    center[0] + np.cos(angle) * rng.uniform(0, morph_range[0] / 2),
                    center[1] + np.sin(angle) * rng.uniform(0, morph_range[1] / 2),
                )
                for angle in np.linspace(0, 720, num=100, endpoint=False)
            ]
        )
        super().__init__(*points)
        self._alpha = 0.4
[docs]
    def distance(self, x: Number, y: Number) -> int:
        """
        No-op that allows returns 0 so that all perturbations are accepted.
        Parameters
        ----------
        x, y : int or float
            Coordinates of a point in 2D space.
        Returns
        -------
        int
            Always returns 0 to allow for scattering of the points.
        """
        return 0