Visualization API¶
Plotting functions for change point detection results.
Overview¶
Visualization utilities for change point detection.
This module provides plotting functions to visualize: - Change point detection results - Metric comparisons across algorithms - Multi-annotator scenarios - Dataset characteristics
- fastcpd.visualization.plot_detection(data: ndarray | List, true_cps: List | ndarray, pred_cps: List | ndarray, metric_result: Dict | None = None, title: str = 'Change Point Detection', figsize: tuple = (14, 8), show_legend: bool = True, save_path: str | None = None) tuple[source]¶
Plot change point detection results.
- Parameters:
data – Time series data (1D or 2D array)
true_cps – True change point indices
pred_cps – Predicted change point indices
metric_result – Optional dict from metrics.evaluate_all()
title – Plot title
figsize – Figure size (width, height)
show_legend – Whether to show legend
save_path – Optional path to save figure
- Returns:
Tuple of (fig, axes)
Examples
>>> from fastcpd.visualization import plot_detection >>> from fastcpd.datasets import make_mean_change >>> from fastcpd import fastcpd >>> from fastcpd.metrics import evaluate_all >>> >>> # Generate data >>> data_dict = make_mean_change(n_samples=500, n_changepoints=3) >>> result = fastcpd(data_dict['data'], family='mean') >>> >>> # Evaluate and plot >>> metrics = evaluate_all(data_dict['changepoints'], result.cp_set.tolist(), ... n_samples=500, margin=10) >>> plot_detection(data_dict['data'], data_dict['changepoints'], ... result.cp_set.tolist(), metrics)
- fastcpd.visualization.plot_metric_comparison(results_dict: Dict[str, Dict], metrics: List[str] = None, figsize: tuple = (12, 6), save_path: str | None = None) tuple[source]¶
Compare metrics across multiple algorithms.
- Parameters:
results_dict – Dict mapping algorithm names to metric results {‘PELT’: metrics_dict, ‘SeGD’: metrics_dict, …}
metrics – List of metrics to compare (default: precision, recall, f1)
figsize – Figure size
save_path – Optional path to save figure
- Returns:
Tuple of (fig, ax)
Examples
>>> from fastcpd.metrics import evaluate_all >>> from fastcpd.visualization import plot_metric_comparison >>> >>> # Assume you have multiple algorithm results >>> pelt_metrics = evaluate_all(true_cps, pelt_cps, n_samples=500, margin=10) >>> segd_metrics = evaluate_all(true_cps, segd_cps, n_samples=500, margin=10) >>> >>> results = {'PELT': pelt_metrics, 'SeGD': segd_metrics} >>> plot_metric_comparison(results)
- fastcpd.visualization.plot_annotators(data: ndarray | List, annotators_list: List[List], pred_cps: List | ndarray, title: str = 'Multi-Annotator Change Point Detection', figsize: tuple = (14, 6), save_path: str | None = None) tuple[source]¶
Visualize multi-annotator scenario.
- Parameters:
data – Time series data
annotators_list – List of lists, each containing one annotator’s CPs
pred_cps – Predicted change points
title – Plot title
figsize – Figure size
save_path – Optional path to save figure
- Returns:
Tuple of (fig, ax)
Examples
>>> from fastcpd.datasets import add_annotation_noise >>> from fastcpd.visualization import plot_annotators >>> >>> true_cps = [100, 200, 300] >>> annotators = add_annotation_noise(true_cps, n_annotators=5, seed=42) >>> pred_cps = [98, 205, 295] >>> >>> plot_annotators(data, annotators, pred_cps)
- fastcpd.visualization.plot_dataset_characteristics(data_dict: Dict[str, Any], figsize: tuple = (14, 10), save_path: str | None = None) tuple[source]¶
Visualize dataset characteristics and metadata.
- Parameters:
data_dict – Dictionary from datasets module (e.g., make_mean_change)
figsize – Figure size
save_path – Optional path to save figure
- Returns:
Tuple of (fig, axes)
Examples
>>> from fastcpd.datasets import make_mean_change >>> from fastcpd.visualization import plot_dataset_characteristics >>> >>> data_dict = make_mean_change(n_samples=500, n_changepoints=3, seed=42) >>> plot_dataset_characteristics(data_dict)
- fastcpd.visualization.plot_roc_curve(true_cps: List | ndarray, pred_cps_list: List[List | ndarray], labels: List[str], n_samples: int, figsize: tuple = (8, 8), save_path: str | None = None) tuple[source]¶
Plot ROC-like curve for change point detection.
For each threshold (margin), computes precision and recall.
- Parameters:
true_cps – True change points
pred_cps_list – List of predicted CP arrays (one per algorithm)
labels – Algorithm labels
n_samples – Total number of samples
figsize – Figure size
save_path – Optional path to save figure
- Returns:
Tuple of (fig, ax)
Plotting Functions¶
Main Plot Functions¶
- fastcpd.visualization.plot_detection(data: ndarray | List, true_cps: List | ndarray, pred_cps: List | ndarray, metric_result: Dict | None = None, title: str = 'Change Point Detection', figsize: tuple = (14, 8), show_legend: bool = True, save_path: str | None = None) tuple[source]¶
Plot change point detection results.
- Parameters:
data – Time series data (1D or 2D array)
true_cps – True change point indices
pred_cps – Predicted change point indices
metric_result – Optional dict from metrics.evaluate_all()
title – Plot title
figsize – Figure size (width, height)
show_legend – Whether to show legend
save_path – Optional path to save figure
- Returns:
Tuple of (fig, axes)
Examples
>>> from fastcpd.visualization import plot_detection >>> from fastcpd.datasets import make_mean_change >>> from fastcpd import fastcpd >>> from fastcpd.metrics import evaluate_all >>> >>> # Generate data >>> data_dict = make_mean_change(n_samples=500, n_changepoints=3) >>> result = fastcpd(data_dict['data'], family='mean') >>> >>> # Evaluate and plot >>> metrics = evaluate_all(data_dict['changepoints'], result.cp_set.tolist(), ... n_samples=500, margin=10) >>> plot_detection(data_dict['data'], data_dict['changepoints'], ... result.cp_set.tolist(), metrics)
- fastcpd.visualization.plot_annotators(data: ndarray | List, annotators_list: List[List], pred_cps: List | ndarray, title: str = 'Multi-Annotator Change Point Detection', figsize: tuple = (14, 6), save_path: str | None = None) tuple[source]¶
Visualize multi-annotator scenario.
- Parameters:
data – Time series data
annotators_list – List of lists, each containing one annotator’s CPs
pred_cps – Predicted change points
title – Plot title
figsize – Figure size
save_path – Optional path to save figure
- Returns:
Tuple of (fig, ax)
Examples
>>> from fastcpd.datasets import add_annotation_noise >>> from fastcpd.visualization import plot_annotators >>> >>> true_cps = [100, 200, 300] >>> annotators = add_annotation_noise(true_cps, n_annotators=5, seed=42) >>> pred_cps = [98, 205, 295] >>> >>> plot_annotators(data, annotators, pred_cps)
- fastcpd.visualization.plot_metric_comparison(results_dict: Dict[str, Dict], metrics: List[str] = None, figsize: tuple = (12, 6), save_path: str | None = None) tuple[source]¶
Compare metrics across multiple algorithms.
- Parameters:
results_dict – Dict mapping algorithm names to metric results {‘PELT’: metrics_dict, ‘SeGD’: metrics_dict, …}
metrics – List of metrics to compare (default: precision, recall, f1)
figsize – Figure size
save_path – Optional path to save figure
- Returns:
Tuple of (fig, ax)
Examples
>>> from fastcpd.metrics import evaluate_all >>> from fastcpd.visualization import plot_metric_comparison >>> >>> # Assume you have multiple algorithm results >>> pelt_metrics = evaluate_all(true_cps, pelt_cps, n_samples=500, margin=10) >>> segd_metrics = evaluate_all(true_cps, segd_cps, n_samples=500, margin=10) >>> >>> results = {'PELT': pelt_metrics, 'SeGD': segd_metrics} >>> plot_metric_comparison(results)
Advanced Plots¶
- fastcpd.visualization.plot_roc_curve(true_cps: List | ndarray, pred_cps_list: List[List | ndarray], labels: List[str], n_samples: int, figsize: tuple = (8, 8), save_path: str | None = None) tuple[source]¶
Plot ROC-like curve for change point detection.
For each threshold (margin), computes precision and recall.
- Parameters:
true_cps – True change points
pred_cps_list – List of predicted CP arrays (one per algorithm)
labels – Algorithm labels
n_samples – Total number of samples
figsize – Figure size
save_path – Optional path to save figure
- Returns:
Tuple of (fig, ax)
- fastcpd.visualization.plot_dataset_characteristics(data_dict: Dict[str, Any], figsize: tuple = (14, 10), save_path: str | None = None) tuple[source]¶
Visualize dataset characteristics and metadata.
- Parameters:
data_dict – Dictionary from datasets module (e.g., make_mean_change)
figsize – Figure size
save_path – Optional path to save figure
- Returns:
Tuple of (fig, axes)
Examples
>>> from fastcpd.datasets import make_mean_change >>> from fastcpd.visualization import plot_dataset_characteristics >>> >>> data_dict = make_mean_change(n_samples=500, n_changepoints=3, seed=42) >>> plot_dataset_characteristics(data_dict)
Example Usage¶
Basic Detection Plot¶
from fastcpd.visualization import plot_detection
import matplotlib.pyplot as plt
import numpy as np
# Generate simple data
data = np.concatenate([
np.random.normal(0, 1, 200),
np.random.normal(3, 1, 200)
])
# Plot
fig, ax = plot_detection(
data=data,
true_cps=[200],
pred_cps=[198],
title="Example Detection"
)
plt.show()
With Metrics Overlay¶
from fastcpd.metrics import evaluate_all
from fastcpd.visualization import plot_detection
# Evaluate metrics
metrics = evaluate_all(
true_cps=[200],
pred_cps=[198],
n_samples=400,
margin=10
)
# Plot with metrics
fig, ax = plot_detection(
data=data,
true_cps=[200],
pred_cps=[198],
metric_result=metrics,
title="Detection with Metrics"
)
Multi-Annotator Visualization¶
from fastcpd.visualization import plot_annotators
# Multiple expert annotations
annotators_list = [
[100, 200, 300],
[105, 195, 305],
[98, 203, 298]
]
fig, ax = plot_annotators(
data=data,
annotators_list=annotators_list,
pred_cps=[102, 201, 299],
title="Multi-Annotator Detection"
)
Algorithm Comparison¶
from fastcpd.visualization import plot_metric_comparison
# Compare multiple algorithms
results_dict = {
'Mean': metrics_mean,
'Rank': metrics_rank,
'RBF': metrics_rbf
}
fig, axes = plot_metric_comparison(
results_dict=results_dict,
metrics=['precision', 'recall', 'f1_score']
)
Customization Options¶
Figure Size¶
fig, ax = plot_detection(
data=data,
pred_cps=[100],
figsize=(14, 6) # Custom size
)
Title and Labels¶
fig, ax = plot_detection(
data=data,
pred_cps=[100],
title="Custom Title"
)
# Further customization
ax.set_xlabel('Time (seconds)')
ax.set_ylabel('Sensor Reading')
Legend Control¶
fig, ax = plot_detection(
data=data,
pred_cps=[100],
show_legend=False # Hide legend
)
Return Values¶
All plotting functions return matplotlib figure and axes objects:
fig, ax = plot_detection(data, pred_cps=[100])
# fig: matplotlib.figure.Figure
# ax: matplotlib.axes.Axes (or array of axes for subplots)
# Further customization
ax.grid(True, alpha=0.3)
fig.tight_layout()
# Save
fig.savefig('my_plot.pdf', dpi=300, bbox_inches='tight')
Saving Figures¶
Save in Multiple Formats¶
fig, ax = plot_detection(data, pred_cps=[100])
# High-resolution PNG
fig.savefig('plot.png', dpi=300, bbox_inches='tight')
# Vector graphics (PDF)
fig.savefig('plot.pdf', bbox_inches='tight')
# SVG
fig.savefig('plot.svg', bbox_inches='tight')
Publication Quality¶
import matplotlib.pyplot as plt
# Set publication style
plt.rcParams['font.size'] = 12
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['figure.dpi'] = 100
plt.rcParams['pdf.fonttype'] = 42 # TrueType fonts
fig, ax = plot_detection(
data=data,
pred_cps=[100],
figsize=(10, 5)
)
fig.savefig('publication_figure.pdf', dpi=300, bbox_inches='tight')