Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 20 additions & 11 deletions pandas/plotting/_matplotlib/style.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
if TYPE_CHECKING:
from matplotlib.colors import Colormap

_conv = matplotlib.colors.ColorConverter()


@overload
def get_standard_colors(
Expand Down Expand Up @@ -199,10 +201,10 @@ def _get_colors_from_color(
raise ValueError(f"Invalid color argument: {color}")

if _is_single_color(color):
color = cast(Color, color)
color = cast("Color", color)
return [color]

color = cast(Collection[Color], color)
color = cast("Collection[Color]", color)
return list(_gen_list_of_colors_from_iterable(color))


Expand Down Expand Up @@ -241,11 +243,21 @@ def _gen_list_of_colors_from_iterable(color: Collection[Color]) -> Iterator[Colo

def _is_floats_color(color: Color | Collection[Color]) -> bool:
"""Check if color comprises a sequence of floats representing color."""
return bool(
is_list_like(color)
and (len(color) == 3 or len(color) == 4)
and all(isinstance(x, (int, float)) for x in color)
)
# Bypass all() for non-list-like or wrong length to avoid iter overhead.
# This check is performed prior to iterating or calling all().
if not is_list_like(color):
return False
n = len(color)
if n != 3 and n != 4:
return False
# Use tuple to avoid generator overhead (CPython optimizes tuple all-iter fast).
# Avoids per-element short-circuit in case of non-(int,float).
# This check is now minimal for performance.
tp = (int, float)
for x in color:
if not isinstance(x, tp):
return False
return True


def _get_colors_from_color_type(color_type: str, num_colors: int) -> list[Color]:
Expand Down Expand Up @@ -298,11 +310,8 @@ def _is_single_string_color(color: Color) -> bool:
True if `color` looks like a valid color.
False otherwise.
"""
conv = matplotlib.colors.ColorConverter()
try:
# error: Argument 1 to "to_rgba" of "ColorConverter" has incompatible type
# "str | Sequence[float]"; expected "tuple[float, float, float] | ..."
conv.to_rgba(color) # type: ignore[arg-type]
_conv.to_rgba(color) # type: ignore[arg-type]
except ValueError:
return False
else:
Expand Down