Source code for plotnine.coords.coord_cartesian
from __future__ import annotations
import typing
from types import SimpleNamespace
from ..iapi import panel_view
from ..positions.position import transform_position
from .coord import coord, dist_euclidean
if typing.TYPE_CHECKING:
from typing import Optional
import pandas as pd
from plotnine.iapi import scale_view
from plotnine.typing import (
FloatArray,
FloatSeries,
Scale,
TupleFloat2,
)
[docs]class coord_cartesian(coord):
"""
Cartesian coordinate system
Parameters
----------
xlim : None | (float, float)
Limits for x axis. If None, then they are
automatically computed.
ylim : None | (float, float)
Limits for y axis. If None, then they are
automatically computed.
expand : bool
If `True`, expand the coordinate axes by
some factor. If `False`, use the limits
from the data.
"""
is_linear = True
def __init__(
self,
xlim: Optional[TupleFloat2] = None,
ylim: Optional[TupleFloat2] = None,
expand: bool = True,
):
self.limits = SimpleNamespace(x=xlim, y=ylim)
self.expand = expand
def transform(
self, data: pd.DataFrame, panel_params: panel_view, munch: bool = False
) -> pd.DataFrame:
from mizani.bounds import squish_infinite
def squish_infinite_x(col):
return squish_infinite(col, range=panel_params.x.range)
def squish_infinite_y(col):
return squish_infinite(col, range=panel_params.y.range)
return transform_position(data, squish_infinite_x, squish_infinite_y)
def setup_panel_params(self, scale_x: Scale, scale_y: Scale) -> panel_view:
"""
Compute the range and break information for the panel
"""
from mizani.transforms import identity_trans
def get_scale_view(
scale: Scale, coord_limits: TupleFloat2
) -> scale_view:
expansion = scale.default_expansion(expand=self.expand)
ranges = scale.expand_limits(
scale.limits, expansion, coord_limits, identity_trans
)
sv = scale.view(limits=coord_limits, range=ranges.range)
return sv
out = panel_view(
x=get_scale_view(scale_x, self.limits.x),
y=get_scale_view(scale_y, self.limits.y),
)
return out
def distance(
self,
x: FloatSeries,
y: FloatSeries,
panel_params: panel_view,
) -> FloatArray:
max_dist = dist_euclidean(panel_params.x.range, panel_params.y.range)[
0
]
return dist_euclidean(x, y) / max_dist