"""
ggpubpy: matplotlib Based Publication-Ready Plots
A Python library that provides easy-to-use functions for creating and customizing
matplotlib-based, publication-ready plots with built-in statistical tests and
automatic p-value or significance star annotations.
This project is directly inspired by R's ggpubr package.
"""
from typing import Any, List, Tuple
__version__ = "0.5.1"
__author__ = "Izzet Turkalp Akbasli"
__email__ = "izzetakbasli@gmail.com"
# Import dataset functions (these don't require scipy)
from . import datasets
from .datasets import (
get_iris_palette,
get_titanic_palette,
list_datasets,
load_iris,
load_titanic,
)
# Explicitly expose selected functions to avoid missing attributes during import in CI
try:
from .qqplot import qqplot as qqplot # type: ignore
except Exception:
# Fallback to lazy import if direct import fails at runtime
def qqplot(*args: Any, **kwargs: Any) -> Any: # type: ignore
from .qqplot import qqplot as _qq
return _qq(*args, **kwargs)
try:
from .bland_altman import plot_blandaltman as plot_blandaltman # type: ignore
except Exception:
def plot_blandaltman(*args: Any, **kwargs: Any) -> Any: # type: ignore
from .bland_altman import plot_blandaltman as _ba
return _ba(*args, **kwargs)
# Lazy imports to avoid scipy import issues during package import
def _import_plots() -> Tuple[Any, Any, Any, List[str]]:
"""Lazy import of plots module."""
try:
from .plots import (
DEFAULT_PALETTE,
plot_boxplot_with_stats,
plot_violin_with_stats,
significance_stars,
)
return (
plot_violin_with_stats,
plot_boxplot_with_stats,
significance_stars,
DEFAULT_PALETTE,
)
except ImportError as e:
raise ImportError(
f"Could not import plotting functions. Please ensure scipy is properly installed: {e}"
)
# Create lazy loading functions
[docs]
def plot_violin(*args: Any, **kwargs: Any) -> Any:
"""Create violin plot with statistical annotations."""
plot_violin_with_stats, _, _, _ = _import_plots()
return plot_violin_with_stats(*args, **kwargs)
[docs]
def plot_boxplot(*args: Any, **kwargs: Any) -> Any:
"""Create box plot with statistical annotations."""
_, plot_boxplot_with_stats, _, _ = _import_plots()
return plot_boxplot_with_stats(*args, **kwargs)
[docs]
def plot_violin_with_stats(*args: Any, **kwargs: Any) -> Any:
"""Create violin plot with statistical annotations."""
func, _, _, _ = _import_plots()
return func(*args, **kwargs)
[docs]
def plot_boxplot_with_stats(*args: Any, **kwargs: Any) -> Any:
"""Create box plot with statistical annotations."""
_, func, _, _ = _import_plots()
return func(*args, **kwargs)
[docs]
def significance_stars(*args: Any, **kwargs: Any) -> Any:
"""Convert p-values to significance stars."""
_, _, func, _ = _import_plots()
return func(*args, **kwargs)
# Lazy DEFAULT_PALETTE access
def get_default_palette() -> List[str]:
"""Get default color palette."""
_, _, _, palette = _import_plots()
return palette
# Lazy loader for shift plot
[docs]
def plot_shift(x: Any, y: Any, *args: Any, **kwargs: Any) -> Any:
"""Shift plot comparing two distributions."""
try:
from .plots import plot_shift as _shift
except ImportError as e:
raise ImportError(
f"Could not import shift plot function. Please ensure dependencies are installed: {e}"
)
return _shift(x, y, *args, **kwargs)
# Lazy loader for correlation matrix plot
[docs]
def plot_correlation_matrix(*args: Any, **kwargs: Any) -> Any:
"""Create a correlation matrix plot with scatter plots and correlation values."""
try:
from .plots import plot_correlation_matrix as _corr_matrix
except ImportError as e:
raise ImportError(
f"Could not import correlation matrix plot function. Please ensure dependencies are installed: {e}"
)
return _corr_matrix(*args, **kwargs)
# Lazy loader for alluvial plot
[docs]
def plot_alluvial(*args: Any, **kwargs: Any) -> Any:
"""Create an alluvial (flow) diagram with explicit alluvium IDs."""
try:
from .alluvialplot import plot_alluvial as _alluvial
except ImportError as e:
raise ImportError(
f"Could not import alluvial plot function. Please ensure dependencies are installed: {e}"
)
return _alluvial(*args, **kwargs)
# Lazy loader for alluvial plot with stats
[docs]
def plot_alluvial_with_stats(*args: Any, **kwargs: Any) -> Any:
"""Create an alluvial plot with optional statistical annotations."""
try:
from .alluvialplot import plot_alluvial_with_stats as _alluvial_stats
except ImportError as e:
raise ImportError(
f"Could not import alluvial plot with stats function. Please ensure dependencies are installed: {e}"
)
return _alluvial_stats(*args, **kwargs)
# Simple DEFAULT_PALETTE for basic access without scipy dependency
DEFAULT_PALETTE = [
"#00AFBB",
"#E7B800",
"#FC4E07",
"#4E79A7",
"#E15759",
"#59A14F",
"#EDC948",
"#B07AA1",
"#FF9DA7",
"#9C755F",
]
__all__ = [
"plot_violin_with_stats",
"plot_boxplot_with_stats",
"plot_violin",
"plot_boxplot",
"significance_stars",
"DEFAULT_PALETTE",
"datasets",
"load_iris",
"load_titanic",
"get_iris_palette",
"get_titanic_palette",
"list_datasets",
"plot_shift",
"plot_correlation_matrix",
"plot_alluvial",
"plot_alluvial_with_stats",
"qqplot",
"plot_blandaltman",
]