ures-visual


Nameures-visual JSON
Version 1.0.3 PyPI version JSON
download
home_pageNone
SummaryA comprehensive, multi-backend visualization library designed for scientific research, data analysis, and machine learning, built on Polars DataFrames with matplotlib/seaborn, plotly, and HoloViews backends.
upload_time2025-08-09 23:20:08
maintainerNone
docs_urlNone
authorstone
requires_python>=3.11
licenseMIT
keywords utilization research tool python visualization data analysis machine learning data science
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ures.plot - Advanced Research Plotting Library

A comprehensive, multi-backend visualization library designed for scientific research, data analysis, and machine learning, built on Polars DataFrames with matplotlib/seaborn, plotly, and HoloViews backends.

## Overview

ures.plot provides a unified interface for creating publication-quality static plots, interactive visualizations, and high-performance ML exploration charts. It supports 21+ traditional plot types plus specialized ML visualizations through a flexible dual-track backend system.

## Installation

```bash
# Core dependencies
pip install matplotlib polars numpy

# Enhanced research plotting
pip install seaborn scipy statsmodels

# Interactive visualization
pip install plotly kaleido

# ML exploration (high-performance)
pip install holoviews bokeh datashader panel

# ML analysis
pip install scikit-learn
```

## Quick Start

### Traditional Research Plotting
```python
import polars as pl
from ures.plot import ResearchPlotter, PlotConfig

# Create sample data
df = pl.DataFrame({
    "x": range(10),
    "y": [i**2 + i for i in range(10)],
    "category": ["A"] * 5 + ["B"] * 5
})

# Initialize plotter
plotter = ResearchPlotter(backend="research")  # or "interactive"

# Create configuration
config = PlotConfig(
    title="Sample Plot",
    xlabel="X Values",
    ylabel="Y Values",
    figsize=(10, 6)
)

# Create plots
fig = plotter.line_plot(df, config, "x", "y")
fig = plotter.scatter_plot(df, config, "x", "y")
fig = plotter.regression_plot(df, config, "x", "y")
```

### ML Visualization (Dual-Track System)
```python
import polars as pl
import numpy as np
from ures.plot.ml import MLVisualizer, MLPlotConfig

# Create ML data
train_data = pl.DataFrame({
    "epoch": range(1, 101),
    "train_loss": np.exp(-np.arange(100) * 0.05) + np.random.normal(0, 0.02, 100),
    "val_loss": np.exp(-np.arange(100) * 0.03) + np.random.normal(0, 0.03, 100),
    "train_acc": 1 - np.exp(-np.arange(100) * 0.04) + np.random.normal(0, 0.01, 100),
    "val_acc": 1 - np.exp(-np.arange(100) * 0.035) + np.random.normal(0, 0.015, 100)
})

# Exploration mode (HoloViews - fast, interactive)
ml_viz = MLVisualizer(mode="exploration")
config = MLPlotConfig(title="Training Progress", mode="exploration")

fig = ml_viz.training_curves(train_data, config,
                           y_cols=["train_loss", "val_loss"])
fig.show()  # Interactive plot in browser

# Publication mode (Matplotlib - high-quality, static)
ml_viz.switch_mode("publication")
pub_config = config.for_publication()  # Auto-optimize for publication

fig = ml_viz.training_curves(train_data, pub_config,
                           y_cols=["train_loss", "val_loss"])
ml_viz.export(fig, "training_curves.pdf", pub_config)
```

## Library Structure
```
ures/plot/
├── __init__.py            # Main package exports
├── ml.py               # Machine learning utilities (if applicable)
backend/
    ├── __init__.py          # Backend package exports
    ├── plotter.py           # ResearchPlotter class and backend switching logic
    ├── config.py            # Configuration management for plots
    ├── annotations.py        # Annotation management system
    ├── color_config.py       # Color scheme management
    └── utils.py             # Utility functions for plotting
```

## Architecture

### Class Diagram
```mermaid
classDiagram
    %% Core Configuration Classes
    class PlotConfig {
        +figsize: Tuple[float, float]
        +title: str
        +xlabel: str
        +ylabel: str
        +x_unit: str
        +y_unit: str
        +color_config: ColorConfig
        +annotations: AnnotationCollection
        +font_config: Dict
        +export_format: str
        +smooth: bool
        +legend: bool
    }

    class MLPlotConfig {
        +experiment_name: str
        +model_name: str
        +mode: str
        +enable_datashading: bool
        +datashade_threshold: int
        +sample_large_data: bool
        +max_sample_size: int
        +publication_dpi: int
        +enable_hover_tools: bool
        +for_publication(): MLPlotConfig
    }

    class ColorConfig {
        +scheme: ColorScheme
        +custom_colors: List[str]
        +get_colors(): List[str]
        +get_color(index): str
    }

    class AnnotationCollection {
        +annotations: List[Annotation]
        +add_annotation(ann: Annotation)
        +add_text(text, x, y)
        +add_arrow(text, x, y)
        +add_box(text, x, y)
        +clear()
    }

    %% Backend Interface
    class PlotBackend {
        <<abstract>>
        +create_line_plot(df, config, x_col, y_col)*
        +create_scatter_plot(df, config, x_col, y_col)*
        +create_bar_plot(df, config, x_col, y_col)*
        +create_histogram(df, config, col)*
        +create_box_plot(df, config, y_col, x_col)*
        +create_violin_plot(df, config, y_col, x_col)*
        +create_heatmap(df, config)*
        +create_regression_plot(df, config, x_col, y_col)*
        +apply_annotations(fig, config)*
        +export_plot(fig, filepath, config)*
    }

    %% Traditional Backends
    class ResearchBackend {
        -fig: matplotlib.Figure
        -ax: matplotlib.Axes
        +_setup_figure(config)
        +_apply_smoothing(x_data, y_data, config)
        +create_line_plot(df, config, x_col, y_col)
        +create_scatter_plot(df, config, x_col, y_col)
        +create_pair_plot(df, config, columns)
        +create_training_curves(df, config, x_col, y_cols)
        +create_confusion_matrix(y_true, y_pred, config)
    }

    class InteractiveBackend {
        +create_line_plot(df, config, x_col, y_col)
        +create_scatter_plot(df, config, x_col, y_col)
        +_setup_plotly_layout(fig, config)
    }

    %% ML-Specific Backends
    class HoloViewsMLBackend {
        +_handle_large_data(df, config, x_col, y_col)
        +_setup_hover_tools(element, config)
        +create_training_curves(df, config, x_col, y_cols)
        +create_confusion_matrix(y_true, y_pred, config)
        +create_feature_importance(importance_data, config)
        +create_line_plot(df, config, x_col, y_col)
        +create_scatter_plot(df, config, x_col, y_col)
    }

    class MatplotlibMLBackend {
        +_setup_ml_style()
        +create_training_curves(df, config, x_col, y_cols)
        +create_confusion_matrix(y_true, y_pred, config)
        +create_feature_importance(importance_data, config)
        +create_roc_curve(y_true, y_scores, config)
    }

    %% Main Interface Classes
    class ResearchPlotter {
        -backend_name: str
        -backend: PlotBackend
        +__init__(backend: str)
        +switch_backend(backend: str)
        +line_plot(df, config, x_col, y_col)
        +scatter_plot(df, config, x_col, y_col)
        +regression_plot(df, config, x_col, y_col)
        +pair_plot(df, config, columns)
        +export(fig, filepath, config)
    }

    class MLVisualizer {
        -mode: str
        -exploration_backend: HoloViewsMLBackend
        -publication_backend: MatplotlibMLBackend
        +__init__(mode: str)
        +switch_mode(mode: str)
        +training_curves(df, config, x_col, y_cols)
        +confusion_matrix(y_true, y_pred, config)
        +feature_importance(importance_data, config)
        +roc_curve(y_true, y_scores, config)
        +scatter_plot(df, config, x_col, y_col)
        +export(fig, filepath, config)
    }

    %% Relationships
    PlotConfig <|-- MLPlotConfig
    PlotConfig *-- ColorConfig
    PlotConfig *-- AnnotationCollection
    PlotBackend <|-- ResearchBackend
    PlotBackend <|-- InteractiveBackend
    PlotBackend <|-- HoloViewsMLBackend
    ResearchBackend <|-- MatplotlibMLBackend
    ResearchPlotter *-- PlotBackend
    MLVisualizer *-- HoloViewsMLBackend
    MLVisualizer *-- MatplotlibMLBackend
    ResearchPlotter ..> PlotConfig
    MLVisualizer ..> MLPlotConfig
```

### Sequence Diagram - ML Dual-Track Visualization
```mermaid
sequenceDiagram
    participant User
    participant MLVisualizer
    participant MLPlotConfig
    participant HoloViews as HoloViewsMLBackend
    participant Matplotlib as MatplotlibMLBackend
    participant DataHandler as Large Data Handler

    %% Exploration Mode Initialization
    User->>MLVisualizer: MLVisualizer(mode="exploration")
    MLVisualizer->>HoloViews: new HoloViewsMLBackend()
    MLVisualizer->>Matplotlib: new MatplotlibMLBackend()
    HoloViews->>HoloViews: configure HoloViews defaults
    Matplotlib->>Matplotlib: setup ML publication styles

    %% Configuration Setup
    User->>MLPlotConfig: MLPlotConfig(mode="exploration", enable_datashading=True)
    MLPlotConfig-->>User: config instance

    %% Exploration Mode - Training Curves
    User->>MLVisualizer: training_curves(large_df, config, y_cols=["train_loss", "val_loss"])
    MLVisualizer->>MLVisualizer: _get_current_backend() -> HoloViewsMLBackend
    MLVisualizer->>HoloViews: create_training_curves(large_df, config, ...)

    HoloViews->>DataHandler: _handle_large_data(large_df, config, x_col, y_cols)

    alt Large Dataset (> 50k points)
        DataHandler->>DataHandler: check datashade_threshold
        DataHandler->>DataHandler: enable datashading
        DataHandler-->>HoloViews: (original_df, use_datashade=True)

        HoloViews->>HoloViews: create hv.Curve for each y_col
        HoloViews->>HoloViews: apply datashade() with color mapping
        HoloViews->>HoloViews: setup interactive tools (hover, zoom)
        HoloViews-->>MLVisualizer: interactive datashaded plot

    else Medium Dataset
        DataHandler-->>HoloViews: (sampled_df, use_datashade=False)
        HoloViews->>HoloViews: create standard hv.Overlay with curves
        HoloViews->>HoloViews: setup hover tools and selection
        HoloViews-->>MLVisualizer: interactive standard plot
    end

    MLVisualizer-->>User: HoloViews interactive figure

    %% Switch to Publication Mode
    User->>MLVisualizer: switch_mode("publication")
    MLVisualizer->>MLVisualizer: mode = "publication"

    %% Publication Configuration
    User->>MLPlotConfig: config.for_publication()
    MLPlotConfig->>MLPlotConfig: override settings for publication
    MLPlotConfig-->>User: publication_config

    %% Publication Mode - Same Data
    User->>MLVisualizer: training_curves(large_df, pub_config, y_cols=["train_loss", "val_loss"])
    MLVisualizer->>MLVisualizer: _get_current_backend() -> MatplotlibMLBackend
    MLVisualizer->>Matplotlib: create_training_curves(large_df, pub_config, ...)

    Matplotlib->>Matplotlib: validate_dataframe(large_df)
    Matplotlib->>Matplotlib: _setup_figure(pub_config)
    Matplotlib->>Matplotlib: setup publication styling (Arial, small fonts)

    loop For each y_col in y_cols
        Matplotlib->>Matplotlib: sns.lineplot() or ax.plot()
        Matplotlib->>Matplotlib: apply publication colors
    end

    Matplotlib->>Matplotlib: apply_annotations(fig, pub_config)
    Matplotlib->>Matplotlib: set legend, grid, labels
    Matplotlib-->>MLVisualizer: matplotlib.Figure
    MLVisualizer-->>User: publication-ready figure

    %% Export Publication Plot
    User->>MLVisualizer: export(fig, "training_curves.pdf", pub_config)
    MLVisualizer->>Matplotlib: export_plot(fig, filepath, pub_config)
    Matplotlib->>Matplotlib: savefig(dpi=300, format="pdf", bbox_inches="tight")
    Matplotlib-->>MLVisualizer: success
    MLVisualizer-->>User: file saved
```

## Core Components

### 1. Traditional Research Plotting

**PlotConfig**: Main configuration class for standard research plots
```python
config = PlotConfig(
    title="Research Results",
    xlabel="Time (days)", ylabel="Response (mV)",
    x_unit="days", y_unit="mV",
    figsize=(12, 8),
    style="whitegrid",
    font_config={
        "title_size": 16,
        "label_size": 14,
        "tick_size": 12
    }
)
```

### 2. ML Dual-Track System

**MLPlotConfig**: Extended configuration for ML workflows
```python
from ures.plot.ml import MLPlotConfig

# Exploration mode - fast, interactive
config = MLPlotConfig(
    title="Model Training",
    mode="exploration",
    enable_datashading=True,
    datashade_threshold=50000,
    enable_hover_tools=True
)

# Publication mode - high-quality, static
pub_config = config.for_publication()  # Auto-optimizes settings
```

**Dual-Track Workflow**:
```python
from ures.plot.ml import MLVisualizer

# Exploration: HoloViews + Datashader (Speed + Interactivity)
ml_viz = MLVisualizer(mode="exploration")

# Publication: Matplotlib + Seaborn (Quality + Control)
ml_viz.switch_mode("publication")
```

### 3. Large Dataset Handling

**Automatic Data Processing**:
```python
# Large dataset (>50k points) - auto-datashading
large_df = pl.DataFrame({
    "x": np.random.randn(100000),
    "y": np.random.randn(100000),
    "category": np.random.choice(["A", "B", "C"], 100000)
})

# Exploration mode: Uses datashading for performance
config = MLPlotConfig(enable_datashading=True, datashade_threshold=50000)
fig = ml_viz.scatter_plot(large_df, config, "x", "y", color_col="category")

# Publication mode: Samples data for quality
pub_config = config.for_publication()  # Disables datashading
fig = ml_viz.scatter_plot(large_df, pub_config, "x", "y", color_col="category")
```

## Usage Examples by Component

### Traditional Research Plotting

**Line Plot with Annotations**:
```python
from ures.plot import ResearchPlotter, PlotConfig

plotter = ResearchPlotter(backend="research")
config = PlotConfig(title="Temperature Monitoring", xlabel="Time", ylabel="Temperature (°C)")

# Add annotations
config.annotations.add_arrow("Peak Temperature", x=12.5, y=42.3, xy_text=(14, 45))
config.annotations.add_box("Critical Zone", x=18, y=38,
                          bbox_props={"boxstyle": "round", "facecolor": "yellow"})

fig = plotter.line_plot(df, config, "time", "temperature")
```

**Correlation Analysis**:
```python
# Heatmap with custom colors
config = PlotConfig(title="Feature Correlations")
config.color_config.scheme = ColorScheme.VIRIDIS

fig = plotter.heatmap(df, config, correlation=True, annot=True)
```

### ML Exploration Mode (HoloViews)

**Interactive Training Curves**:
```python
from ures.plot.ml import MLVisualizer, MLPlotConfig

ml_viz = MLVisualizer(mode="exploration")
config = MLPlotConfig(
    title="Training Progress",
    mode="exploration",
    enable_hover_tools=True,
    enable_selection_tools=True
)

# Interactive plot with hover data
fig = ml_viz.training_curves(
    train_df, config,
    x_col="epoch",
    y_cols=["train_loss", "val_loss", "train_acc", "val_acc"]
)
fig.show()  # Opens in browser
```

**High-Performance Scatter Plot**:
```python
# Handles 100k+ points with datashading
config = MLPlotConfig(
    enable_datashading=True,
    datashade_threshold=10000
)

fig = ml_viz.scatter_plot(
    large_embeddings_df, config,
    "x", "y",
    color_col="cluster_id"
)
```

**Feature Importance Visualization**:
```python
importance_data = {
    "feature_1": 0.45,
    "feature_2": 0.32,
    "feature_3": 0.28,
    # ... more features
}

fig = ml_viz.feature_importance(importance_data, config, top_n=15)
```

### ML Publication Mode (Matplotlib)

**Publication-Ready Training Curves**:
```python
ml_viz.switch_mode("publication")
pub_config = MLPlotConfig().for_publication()

fig = ml_viz.training_curves(train_df, pub_config,
                           y_cols=["train_loss", "val_loss"])
ml_viz.export(fig, "training_curves.pdf", pub_config)
```

**Confusion Matrix**:
```python
import numpy as np

y_true = np.array([0, 1, 2, 2, 1, 0, 1, 2])
y_pred = np.array([0, 2, 1, 2, 1, 0, 1, 2])
class_names = ["Class A", "Class B", "Class C"]

fig = ml_viz.confusion_matrix(y_true, y_pred, pub_config, class_names)
```

**ROC Curve Analysis**:
```python
# Binary classification ROC curve
y_true_binary = np.array([0, 0, 1, 1, 0, 1, 1, 0])
y_scores = np.array([0.1, 0.4, 0.35, 0.8, 0.65, 0.9, 0.7, 0.2])

fig = ml_viz.roc_curve(y_true_binary, y_scores, pub_config)
ml_viz.export(fig, "roc_curve.png", pub_config)
```

### Backend Comparison

| Feature | Research Backend | Interactive Backend | ML Exploration | ML Publication |
|---------|------------------|-------------------|----------------|----------------|
| **Library** | Matplotlib + Seaborn | Plotly | HoloViews + Datashader | Matplotlib + Seaborn |
| **Performance** | Good | Good | Excellent (100k+ points) | Good |
| **Interactivity** | None | Full | Full + Tools | None |
| **Publication Quality** | Excellent | Good | Fair | Excellent |
| **Large Data** | Limited | Limited | Optimized | Sampling |
| **Export Formats** | PNG, PDF, SVG | PNG, PDF, HTML | PNG, HTML | PNG, PDF |

### Advanced ML Workflows

**Complete ML Experiment Visualization**:
```python
from ures.plot.ml import MLVisualizer, MLPlotConfig

# Initialize dual-mode visualizer
ml_viz = MLVisualizer(mode="exploration")

# Experiment tracking
config = MLPlotConfig(
    experiment_name="bert_finetuning",
    model_name="bert-base-uncased",
    mode="exploration"
)

# 1. Training curves (exploration)
training_fig = ml_viz.training_curves(metrics_df, config,
                                    y_cols=["train_loss", "val_loss", "f1_score"])

# 2. Feature importance (exploration)
importance_fig = ml_viz.feature_importance(feature_weights, config)

# 3. Switch to publication mode
ml_viz.switch_mode("publication")
pub_config = config.for_publication()

# 4. Generate publication plots
final_training = ml_viz.training_curves(metrics_df, pub_config,
                                      y_cols=["train_loss", "val_loss"])
final_confusion = ml_viz.confusion_matrix(y_test, y_pred, pub_config, class_names)

# 5. Export for paper
ml_viz.export(final_training, "figure1_training.pdf", pub_config)
ml_viz.export(final_confusion, "figure2_confusion.pdf", pub_config)
```

## Dependency Management

The library gracefully handles optional dependencies:

```python
from ures.plot.backend.deps import check_dependencies

check_dependencies()

# Output shows ML capabilities:
# Research Plotting Dependencies:
# ========================================
# - Matplotlib: ✓ (required - core plotting)
# - Polars: ✓ (required - data handling)
# - NumPy: ✓ (required - numerical operations)
#
# Optional Dependencies:
# -------------------------
# - Seaborn: ✓ (optional - enhanced research plots)
# - Plotly: ✓ (optional - interactive visualization)
# - HoloViews: ✓ (optional - ML exploration)
# - Datashader: ✓ (optional - large data visualization)
# - Scikit-learn: ✓ (optional - ML metrics)
```

## Complete Feature Matrix

### Traditional Research Plots (21 types)

| Category | Plot Types | Methods | Backend Support |
|----------|------------|---------|----------------|
| **Basic** | Line, Scatter, Bar, Histogram, Box, Violin | `line_plot()`, `scatter_plot()`, etc. | Research + Interactive |
| **Multi-dimensional** | Heatmap, Bubble, Radar, Parallel Coordinates | `heatmap()`, `bubble_plot()`, etc. | Research + Interactive |
| **Scientific** | Error Bar, Regression, Residual, Q-Q, Density, CDF | `regression_plot()`, `error_bar_plot()`, etc. | Research |
| **Advanced** | Subplot Grid, Pair Plot, Facet Grid | `pair_plot()`, `subplots_grid()`, etc. | Research |
| **Time Series** | Decomposition, ACF/PACF | `time_series_decomposition()`, `acf_pacf_plot()` | Research |

### ML-Specific Visualizations

| Category | Plot Types | Methods | Exploration | Publication |
|----------|------------|---------|-------------|-------------|
| **Training** | Training Curves, Loss Landscapes | `training_curves()` | ✓ HoloViews | ✓ Matplotlib |
| **Evaluation** | Confusion Matrix, ROC/PR Curves | `confusion_matrix()`, `roc_curve()` | ✓ Interactive | ✓ Static |
| **Interpretation** | Feature Importance, SHAP plots | `feature_importance()` | ✓ Interactive | ✓ Static |
| **Data** | Large Scatter, Embeddings | `scatter_plot()` with datashading | ✓ Optimized | ✓ Sampled |

The library provides a complete solution for both traditional research visualization and modern ML workflows, with automatic optimization for different use cases and data scales.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "ures-visual",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "utilization, Research Tool, Python, visualization, data analysis, machine learning, data science",
    "author": "stone",
    "author_email": "github@stone-bo.com",
    "download_url": "https://files.pythonhosted.org/packages/46/8b/f0367e236da6079cf37f6c37c63d7eee708b223429b1ccf92dbc53b92ca1/ures_visual-1.0.3.tar.gz",
    "platform": null,
    "description": "# ures.plot - Advanced Research Plotting Library\n\nA comprehensive, multi-backend visualization library designed for scientific research, data analysis, and machine learning, built on Polars DataFrames with matplotlib/seaborn, plotly, and HoloViews backends.\n\n## Overview\n\nures.plot provides a unified interface for creating publication-quality static plots, interactive visualizations, and high-performance ML exploration charts. It supports 21+ traditional plot types plus specialized ML visualizations through a flexible dual-track backend system.\n\n## Installation\n\n```bash\n# Core dependencies\npip install matplotlib polars numpy\n\n# Enhanced research plotting\npip install seaborn scipy statsmodels\n\n# Interactive visualization\npip install plotly kaleido\n\n# ML exploration (high-performance)\npip install holoviews bokeh datashader panel\n\n# ML analysis\npip install scikit-learn\n```\n\n## Quick Start\n\n### Traditional Research Plotting\n```python\nimport polars as pl\nfrom ures.plot import ResearchPlotter, PlotConfig\n\n# Create sample data\ndf = pl.DataFrame({\n    \"x\": range(10),\n    \"y\": [i**2 + i for i in range(10)],\n    \"category\": [\"A\"] * 5 + [\"B\"] * 5\n})\n\n# Initialize plotter\nplotter = ResearchPlotter(backend=\"research\")  # or \"interactive\"\n\n# Create configuration\nconfig = PlotConfig(\n    title=\"Sample Plot\",\n    xlabel=\"X Values\",\n    ylabel=\"Y Values\",\n    figsize=(10, 6)\n)\n\n# Create plots\nfig = plotter.line_plot(df, config, \"x\", \"y\")\nfig = plotter.scatter_plot(df, config, \"x\", \"y\")\nfig = plotter.regression_plot(df, config, \"x\", \"y\")\n```\n\n### ML Visualization (Dual-Track System)\n```python\nimport polars as pl\nimport numpy as np\nfrom ures.plot.ml import MLVisualizer, MLPlotConfig\n\n# Create ML data\ntrain_data = pl.DataFrame({\n    \"epoch\": range(1, 101),\n    \"train_loss\": np.exp(-np.arange(100) * 0.05) + np.random.normal(0, 0.02, 100),\n    \"val_loss\": np.exp(-np.arange(100) * 0.03) + np.random.normal(0, 0.03, 100),\n    \"train_acc\": 1 - np.exp(-np.arange(100) * 0.04) + np.random.normal(0, 0.01, 100),\n    \"val_acc\": 1 - np.exp(-np.arange(100) * 0.035) + np.random.normal(0, 0.015, 100)\n})\n\n# Exploration mode (HoloViews - fast, interactive)\nml_viz = MLVisualizer(mode=\"exploration\")\nconfig = MLPlotConfig(title=\"Training Progress\", mode=\"exploration\")\n\nfig = ml_viz.training_curves(train_data, config,\n                           y_cols=[\"train_loss\", \"val_loss\"])\nfig.show()  # Interactive plot in browser\n\n# Publication mode (Matplotlib - high-quality, static)\nml_viz.switch_mode(\"publication\")\npub_config = config.for_publication()  # Auto-optimize for publication\n\nfig = ml_viz.training_curves(train_data, pub_config,\n                           y_cols=[\"train_loss\", \"val_loss\"])\nml_viz.export(fig, \"training_curves.pdf\", pub_config)\n```\n\n## Library Structure\n```\nures/plot/\n\u251c\u2500\u2500 __init__.py            # Main package exports\n\u251c\u2500\u2500 ml.py               # Machine learning utilities (if applicable)\nbackend/\n    \u251c\u2500\u2500 __init__.py          # Backend package exports\n    \u251c\u2500\u2500 plotter.py           # ResearchPlotter class and backend switching logic\n    \u251c\u2500\u2500 config.py            # Configuration management for plots\n    \u251c\u2500\u2500 annotations.py        # Annotation management system\n    \u251c\u2500\u2500 color_config.py       # Color scheme management\n    \u2514\u2500\u2500 utils.py             # Utility functions for plotting\n```\n\n## Architecture\n\n### Class Diagram\n```mermaid\nclassDiagram\n    %% Core Configuration Classes\n    class PlotConfig {\n        +figsize: Tuple[float, float]\n        +title: str\n        +xlabel: str\n        +ylabel: str\n        +x_unit: str\n        +y_unit: str\n        +color_config: ColorConfig\n        +annotations: AnnotationCollection\n        +font_config: Dict\n        +export_format: str\n        +smooth: bool\n        +legend: bool\n    }\n\n    class MLPlotConfig {\n        +experiment_name: str\n        +model_name: str\n        +mode: str\n        +enable_datashading: bool\n        +datashade_threshold: int\n        +sample_large_data: bool\n        +max_sample_size: int\n        +publication_dpi: int\n        +enable_hover_tools: bool\n        +for_publication(): MLPlotConfig\n    }\n\n    class ColorConfig {\n        +scheme: ColorScheme\n        +custom_colors: List[str]\n        +get_colors(): List[str]\n        +get_color(index): str\n    }\n\n    class AnnotationCollection {\n        +annotations: List[Annotation]\n        +add_annotation(ann: Annotation)\n        +add_text(text, x, y)\n        +add_arrow(text, x, y)\n        +add_box(text, x, y)\n        +clear()\n    }\n\n    %% Backend Interface\n    class PlotBackend {\n        <<abstract>>\n        +create_line_plot(df, config, x_col, y_col)*\n        +create_scatter_plot(df, config, x_col, y_col)*\n        +create_bar_plot(df, config, x_col, y_col)*\n        +create_histogram(df, config, col)*\n        +create_box_plot(df, config, y_col, x_col)*\n        +create_violin_plot(df, config, y_col, x_col)*\n        +create_heatmap(df, config)*\n        +create_regression_plot(df, config, x_col, y_col)*\n        +apply_annotations(fig, config)*\n        +export_plot(fig, filepath, config)*\n    }\n\n    %% Traditional Backends\n    class ResearchBackend {\n        -fig: matplotlib.Figure\n        -ax: matplotlib.Axes\n        +_setup_figure(config)\n        +_apply_smoothing(x_data, y_data, config)\n        +create_line_plot(df, config, x_col, y_col)\n        +create_scatter_plot(df, config, x_col, y_col)\n        +create_pair_plot(df, config, columns)\n        +create_training_curves(df, config, x_col, y_cols)\n        +create_confusion_matrix(y_true, y_pred, config)\n    }\n\n    class InteractiveBackend {\n        +create_line_plot(df, config, x_col, y_col)\n        +create_scatter_plot(df, config, x_col, y_col)\n        +_setup_plotly_layout(fig, config)\n    }\n\n    %% ML-Specific Backends\n    class HoloViewsMLBackend {\n        +_handle_large_data(df, config, x_col, y_col)\n        +_setup_hover_tools(element, config)\n        +create_training_curves(df, config, x_col, y_cols)\n        +create_confusion_matrix(y_true, y_pred, config)\n        +create_feature_importance(importance_data, config)\n        +create_line_plot(df, config, x_col, y_col)\n        +create_scatter_plot(df, config, x_col, y_col)\n    }\n\n    class MatplotlibMLBackend {\n        +_setup_ml_style()\n        +create_training_curves(df, config, x_col, y_cols)\n        +create_confusion_matrix(y_true, y_pred, config)\n        +create_feature_importance(importance_data, config)\n        +create_roc_curve(y_true, y_scores, config)\n    }\n\n    %% Main Interface Classes\n    class ResearchPlotter {\n        -backend_name: str\n        -backend: PlotBackend\n        +__init__(backend: str)\n        +switch_backend(backend: str)\n        +line_plot(df, config, x_col, y_col)\n        +scatter_plot(df, config, x_col, y_col)\n        +regression_plot(df, config, x_col, y_col)\n        +pair_plot(df, config, columns)\n        +export(fig, filepath, config)\n    }\n\n    class MLVisualizer {\n        -mode: str\n        -exploration_backend: HoloViewsMLBackend\n        -publication_backend: MatplotlibMLBackend\n        +__init__(mode: str)\n        +switch_mode(mode: str)\n        +training_curves(df, config, x_col, y_cols)\n        +confusion_matrix(y_true, y_pred, config)\n        +feature_importance(importance_data, config)\n        +roc_curve(y_true, y_scores, config)\n        +scatter_plot(df, config, x_col, y_col)\n        +export(fig, filepath, config)\n    }\n\n    %% Relationships\n    PlotConfig <|-- MLPlotConfig\n    PlotConfig *-- ColorConfig\n    PlotConfig *-- AnnotationCollection\n    PlotBackend <|-- ResearchBackend\n    PlotBackend <|-- InteractiveBackend\n    PlotBackend <|-- HoloViewsMLBackend\n    ResearchBackend <|-- MatplotlibMLBackend\n    ResearchPlotter *-- PlotBackend\n    MLVisualizer *-- HoloViewsMLBackend\n    MLVisualizer *-- MatplotlibMLBackend\n    ResearchPlotter ..> PlotConfig\n    MLVisualizer ..> MLPlotConfig\n```\n\n### Sequence Diagram - ML Dual-Track Visualization\n```mermaid\nsequenceDiagram\n    participant User\n    participant MLVisualizer\n    participant MLPlotConfig\n    participant HoloViews as HoloViewsMLBackend\n    participant Matplotlib as MatplotlibMLBackend\n    participant DataHandler as Large Data Handler\n\n    %% Exploration Mode Initialization\n    User->>MLVisualizer: MLVisualizer(mode=\"exploration\")\n    MLVisualizer->>HoloViews: new HoloViewsMLBackend()\n    MLVisualizer->>Matplotlib: new MatplotlibMLBackend()\n    HoloViews->>HoloViews: configure HoloViews defaults\n    Matplotlib->>Matplotlib: setup ML publication styles\n\n    %% Configuration Setup\n    User->>MLPlotConfig: MLPlotConfig(mode=\"exploration\", enable_datashading=True)\n    MLPlotConfig-->>User: config instance\n\n    %% Exploration Mode - Training Curves\n    User->>MLVisualizer: training_curves(large_df, config, y_cols=[\"train_loss\", \"val_loss\"])\n    MLVisualizer->>MLVisualizer: _get_current_backend() -> HoloViewsMLBackend\n    MLVisualizer->>HoloViews: create_training_curves(large_df, config, ...)\n\n    HoloViews->>DataHandler: _handle_large_data(large_df, config, x_col, y_cols)\n\n    alt Large Dataset (> 50k points)\n        DataHandler->>DataHandler: check datashade_threshold\n        DataHandler->>DataHandler: enable datashading\n        DataHandler-->>HoloViews: (original_df, use_datashade=True)\n\n        HoloViews->>HoloViews: create hv.Curve for each y_col\n        HoloViews->>HoloViews: apply datashade() with color mapping\n        HoloViews->>HoloViews: setup interactive tools (hover, zoom)\n        HoloViews-->>MLVisualizer: interactive datashaded plot\n\n    else Medium Dataset\n        DataHandler-->>HoloViews: (sampled_df, use_datashade=False)\n        HoloViews->>HoloViews: create standard hv.Overlay with curves\n        HoloViews->>HoloViews: setup hover tools and selection\n        HoloViews-->>MLVisualizer: interactive standard plot\n    end\n\n    MLVisualizer-->>User: HoloViews interactive figure\n\n    %% Switch to Publication Mode\n    User->>MLVisualizer: switch_mode(\"publication\")\n    MLVisualizer->>MLVisualizer: mode = \"publication\"\n\n    %% Publication Configuration\n    User->>MLPlotConfig: config.for_publication()\n    MLPlotConfig->>MLPlotConfig: override settings for publication\n    MLPlotConfig-->>User: publication_config\n\n    %% Publication Mode - Same Data\n    User->>MLVisualizer: training_curves(large_df, pub_config, y_cols=[\"train_loss\", \"val_loss\"])\n    MLVisualizer->>MLVisualizer: _get_current_backend() -> MatplotlibMLBackend\n    MLVisualizer->>Matplotlib: create_training_curves(large_df, pub_config, ...)\n\n    Matplotlib->>Matplotlib: validate_dataframe(large_df)\n    Matplotlib->>Matplotlib: _setup_figure(pub_config)\n    Matplotlib->>Matplotlib: setup publication styling (Arial, small fonts)\n\n    loop For each y_col in y_cols\n        Matplotlib->>Matplotlib: sns.lineplot() or ax.plot()\n        Matplotlib->>Matplotlib: apply publication colors\n    end\n\n    Matplotlib->>Matplotlib: apply_annotations(fig, pub_config)\n    Matplotlib->>Matplotlib: set legend, grid, labels\n    Matplotlib-->>MLVisualizer: matplotlib.Figure\n    MLVisualizer-->>User: publication-ready figure\n\n    %% Export Publication Plot\n    User->>MLVisualizer: export(fig, \"training_curves.pdf\", pub_config)\n    MLVisualizer->>Matplotlib: export_plot(fig, filepath, pub_config)\n    Matplotlib->>Matplotlib: savefig(dpi=300, format=\"pdf\", bbox_inches=\"tight\")\n    Matplotlib-->>MLVisualizer: success\n    MLVisualizer-->>User: file saved\n```\n\n## Core Components\n\n### 1. Traditional Research Plotting\n\n**PlotConfig**: Main configuration class for standard research plots\n```python\nconfig = PlotConfig(\n    title=\"Research Results\",\n    xlabel=\"Time (days)\", ylabel=\"Response (mV)\",\n    x_unit=\"days\", y_unit=\"mV\",\n    figsize=(12, 8),\n    style=\"whitegrid\",\n    font_config={\n        \"title_size\": 16,\n        \"label_size\": 14,\n        \"tick_size\": 12\n    }\n)\n```\n\n### 2. ML Dual-Track System\n\n**MLPlotConfig**: Extended configuration for ML workflows\n```python\nfrom ures.plot.ml import MLPlotConfig\n\n# Exploration mode - fast, interactive\nconfig = MLPlotConfig(\n    title=\"Model Training\",\n    mode=\"exploration\",\n    enable_datashading=True,\n    datashade_threshold=50000,\n    enable_hover_tools=True\n)\n\n# Publication mode - high-quality, static\npub_config = config.for_publication()  # Auto-optimizes settings\n```\n\n**Dual-Track Workflow**:\n```python\nfrom ures.plot.ml import MLVisualizer\n\n# Exploration: HoloViews + Datashader (Speed + Interactivity)\nml_viz = MLVisualizer(mode=\"exploration\")\n\n# Publication: Matplotlib + Seaborn (Quality + Control)\nml_viz.switch_mode(\"publication\")\n```\n\n### 3. Large Dataset Handling\n\n**Automatic Data Processing**:\n```python\n# Large dataset (>50k points) - auto-datashading\nlarge_df = pl.DataFrame({\n    \"x\": np.random.randn(100000),\n    \"y\": np.random.randn(100000),\n    \"category\": np.random.choice([\"A\", \"B\", \"C\"], 100000)\n})\n\n# Exploration mode: Uses datashading for performance\nconfig = MLPlotConfig(enable_datashading=True, datashade_threshold=50000)\nfig = ml_viz.scatter_plot(large_df, config, \"x\", \"y\", color_col=\"category\")\n\n# Publication mode: Samples data for quality\npub_config = config.for_publication()  # Disables datashading\nfig = ml_viz.scatter_plot(large_df, pub_config, \"x\", \"y\", color_col=\"category\")\n```\n\n## Usage Examples by Component\n\n### Traditional Research Plotting\n\n**Line Plot with Annotations**:\n```python\nfrom ures.plot import ResearchPlotter, PlotConfig\n\nplotter = ResearchPlotter(backend=\"research\")\nconfig = PlotConfig(title=\"Temperature Monitoring\", xlabel=\"Time\", ylabel=\"Temperature (\u00b0C)\")\n\n# Add annotations\nconfig.annotations.add_arrow(\"Peak Temperature\", x=12.5, y=42.3, xy_text=(14, 45))\nconfig.annotations.add_box(\"Critical Zone\", x=18, y=38,\n                          bbox_props={\"boxstyle\": \"round\", \"facecolor\": \"yellow\"})\n\nfig = plotter.line_plot(df, config, \"time\", \"temperature\")\n```\n\n**Correlation Analysis**:\n```python\n# Heatmap with custom colors\nconfig = PlotConfig(title=\"Feature Correlations\")\nconfig.color_config.scheme = ColorScheme.VIRIDIS\n\nfig = plotter.heatmap(df, config, correlation=True, annot=True)\n```\n\n### ML Exploration Mode (HoloViews)\n\n**Interactive Training Curves**:\n```python\nfrom ures.plot.ml import MLVisualizer, MLPlotConfig\n\nml_viz = MLVisualizer(mode=\"exploration\")\nconfig = MLPlotConfig(\n    title=\"Training Progress\",\n    mode=\"exploration\",\n    enable_hover_tools=True,\n    enable_selection_tools=True\n)\n\n# Interactive plot with hover data\nfig = ml_viz.training_curves(\n    train_df, config,\n    x_col=\"epoch\",\n    y_cols=[\"train_loss\", \"val_loss\", \"train_acc\", \"val_acc\"]\n)\nfig.show()  # Opens in browser\n```\n\n**High-Performance Scatter Plot**:\n```python\n# Handles 100k+ points with datashading\nconfig = MLPlotConfig(\n    enable_datashading=True,\n    datashade_threshold=10000\n)\n\nfig = ml_viz.scatter_plot(\n    large_embeddings_df, config,\n    \"x\", \"y\",\n    color_col=\"cluster_id\"\n)\n```\n\n**Feature Importance Visualization**:\n```python\nimportance_data = {\n    \"feature_1\": 0.45,\n    \"feature_2\": 0.32,\n    \"feature_3\": 0.28,\n    # ... more features\n}\n\nfig = ml_viz.feature_importance(importance_data, config, top_n=15)\n```\n\n### ML Publication Mode (Matplotlib)\n\n**Publication-Ready Training Curves**:\n```python\nml_viz.switch_mode(\"publication\")\npub_config = MLPlotConfig().for_publication()\n\nfig = ml_viz.training_curves(train_df, pub_config,\n                           y_cols=[\"train_loss\", \"val_loss\"])\nml_viz.export(fig, \"training_curves.pdf\", pub_config)\n```\n\n**Confusion Matrix**:\n```python\nimport numpy as np\n\ny_true = np.array([0, 1, 2, 2, 1, 0, 1, 2])\ny_pred = np.array([0, 2, 1, 2, 1, 0, 1, 2])\nclass_names = [\"Class A\", \"Class B\", \"Class C\"]\n\nfig = ml_viz.confusion_matrix(y_true, y_pred, pub_config, class_names)\n```\n\n**ROC Curve Analysis**:\n```python\n# Binary classification ROC curve\ny_true_binary = np.array([0, 0, 1, 1, 0, 1, 1, 0])\ny_scores = np.array([0.1, 0.4, 0.35, 0.8, 0.65, 0.9, 0.7, 0.2])\n\nfig = ml_viz.roc_curve(y_true_binary, y_scores, pub_config)\nml_viz.export(fig, \"roc_curve.png\", pub_config)\n```\n\n### Backend Comparison\n\n| Feature | Research Backend | Interactive Backend | ML Exploration | ML Publication |\n|---------|------------------|-------------------|----------------|----------------|\n| **Library** | Matplotlib + Seaborn | Plotly | HoloViews + Datashader | Matplotlib + Seaborn |\n| **Performance** | Good | Good | Excellent (100k+ points) | Good |\n| **Interactivity** | None | Full | Full + Tools | None |\n| **Publication Quality** | Excellent | Good | Fair | Excellent |\n| **Large Data** | Limited | Limited | Optimized | Sampling |\n| **Export Formats** | PNG, PDF, SVG | PNG, PDF, HTML | PNG, HTML | PNG, PDF |\n\n### Advanced ML Workflows\n\n**Complete ML Experiment Visualization**:\n```python\nfrom ures.plot.ml import MLVisualizer, MLPlotConfig\n\n# Initialize dual-mode visualizer\nml_viz = MLVisualizer(mode=\"exploration\")\n\n# Experiment tracking\nconfig = MLPlotConfig(\n    experiment_name=\"bert_finetuning\",\n    model_name=\"bert-base-uncased\",\n    mode=\"exploration\"\n)\n\n# 1. Training curves (exploration)\ntraining_fig = ml_viz.training_curves(metrics_df, config,\n                                    y_cols=[\"train_loss\", \"val_loss\", \"f1_score\"])\n\n# 2. Feature importance (exploration)\nimportance_fig = ml_viz.feature_importance(feature_weights, config)\n\n# 3. Switch to publication mode\nml_viz.switch_mode(\"publication\")\npub_config = config.for_publication()\n\n# 4. Generate publication plots\nfinal_training = ml_viz.training_curves(metrics_df, pub_config,\n                                      y_cols=[\"train_loss\", \"val_loss\"])\nfinal_confusion = ml_viz.confusion_matrix(y_test, y_pred, pub_config, class_names)\n\n# 5. Export for paper\nml_viz.export(final_training, \"figure1_training.pdf\", pub_config)\nml_viz.export(final_confusion, \"figure2_confusion.pdf\", pub_config)\n```\n\n## Dependency Management\n\nThe library gracefully handles optional dependencies:\n\n```python\nfrom ures.plot.backend.deps import check_dependencies\n\ncheck_dependencies()\n\n# Output shows ML capabilities:\n# Research Plotting Dependencies:\n# ========================================\n# - Matplotlib: \u2713 (required - core plotting)\n# - Polars: \u2713 (required - data handling)\n# - NumPy: \u2713 (required - numerical operations)\n#\n# Optional Dependencies:\n# -------------------------\n# - Seaborn: \u2713 (optional - enhanced research plots)\n# - Plotly: \u2713 (optional - interactive visualization)\n# - HoloViews: \u2713 (optional - ML exploration)\n# - Datashader: \u2713 (optional - large data visualization)\n# - Scikit-learn: \u2713 (optional - ML metrics)\n```\n\n## Complete Feature Matrix\n\n### Traditional Research Plots (21 types)\n\n| Category | Plot Types | Methods | Backend Support |\n|----------|------------|---------|----------------|\n| **Basic** | Line, Scatter, Bar, Histogram, Box, Violin | `line_plot()`, `scatter_plot()`, etc. | Research + Interactive |\n| **Multi-dimensional** | Heatmap, Bubble, Radar, Parallel Coordinates | `heatmap()`, `bubble_plot()`, etc. | Research + Interactive |\n| **Scientific** | Error Bar, Regression, Residual, Q-Q, Density, CDF | `regression_plot()`, `error_bar_plot()`, etc. | Research |\n| **Advanced** | Subplot Grid, Pair Plot, Facet Grid | `pair_plot()`, `subplots_grid()`, etc. | Research |\n| **Time Series** | Decomposition, ACF/PACF | `time_series_decomposition()`, `acf_pacf_plot()` | Research |\n\n### ML-Specific Visualizations\n\n| Category | Plot Types | Methods | Exploration | Publication |\n|----------|------------|---------|-------------|-------------|\n| **Training** | Training Curves, Loss Landscapes | `training_curves()` | \u2713 HoloViews | \u2713 Matplotlib |\n| **Evaluation** | Confusion Matrix, ROC/PR Curves | `confusion_matrix()`, `roc_curve()` | \u2713 Interactive | \u2713 Static |\n| **Interpretation** | Feature Importance, SHAP plots | `feature_importance()` | \u2713 Interactive | \u2713 Static |\n| **Data** | Large Scatter, Embeddings | `scatter_plot()` with datashading | \u2713 Optimized | \u2713 Sampled |\n\nThe library provides a complete solution for both traditional research visualization and modern ML workflows, with automatic optimization for different use cases and data scales.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A comprehensive, multi-backend visualization library designed for scientific research, data analysis, and machine learning, built on Polars DataFrames with matplotlib/seaborn, plotly, and HoloViews backends.",
    "version": "1.0.3",
    "project_urls": null,
    "split_keywords": [
        "utilization",
        " research tool",
        " python",
        " visualization",
        " data analysis",
        " machine learning",
        " data science"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1fb4cc17e969d045a464721c784b1e7a93f0822412636086c25cc89638766111",
                "md5": "d0a15322ddb21d4348e03f73f4c766c9",
                "sha256": "c14745f9fa651e20d4c79d8d81659e3fff5d1f95feae86c323c86e084bb93569"
            },
            "downloads": -1,
            "filename": "ures_visual-1.0.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d0a15322ddb21d4348e03f73f4c766c9",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 54493,
            "upload_time": "2025-08-09T23:20:07",
            "upload_time_iso_8601": "2025-08-09T23:20:07.531345Z",
            "url": "https://files.pythonhosted.org/packages/1f/b4/cc17e969d045a464721c784b1e7a93f0822412636086c25cc89638766111/ures_visual-1.0.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "468bf0367e236da6079cf37f6c37c63d7eee708b223429b1ccf92dbc53b92ca1",
                "md5": "dad38595bdd5210ee603ec879c75772c",
                "sha256": "437342f26678e8cefef28bba35817b7b381f03bc9ce61a97aa8c053aba5e073d"
            },
            "downloads": -1,
            "filename": "ures_visual-1.0.3.tar.gz",
            "has_sig": false,
            "md5_digest": "dad38595bdd5210ee603ec879c75772c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 51641,
            "upload_time": "2025-08-09T23:20:08",
            "upload_time_iso_8601": "2025-08-09T23:20:08.918398Z",
            "url": "https://files.pythonhosted.org/packages/46/8b/f0367e236da6079cf37f6c37c63d7eee708b223429b1ccf92dbc53b92ca1/ures_visual-1.0.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-09 23:20:08",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "ures-visual"
}
        
Elapsed time: 0.39819s