Initial commit
This commit is contained in:
353
skills/pymoo/references/visualization.md
Normal file
353
skills/pymoo/references/visualization.md
Normal file
@@ -0,0 +1,353 @@
|
||||
# Pymoo Visualization Reference
|
||||
|
||||
Comprehensive reference for visualization capabilities in pymoo.
|
||||
|
||||
## Overview
|
||||
|
||||
Pymoo provides eight visualization types for analyzing multi-objective optimization results. All plots wrap matplotlib and accept standard matplotlib keyword arguments for customization.
|
||||
|
||||
## Core Visualization Types
|
||||
|
||||
### 1. Scatter Plots
|
||||
**Purpose:** Visualize objective space for 2D, 3D, or higher dimensions
|
||||
**Best for:** Pareto fronts, solution distributions, algorithm comparisons
|
||||
|
||||
**Usage:**
|
||||
```python
|
||||
from pymoo.visualization.scatter import Scatter
|
||||
|
||||
# 2D scatter plot
|
||||
plot = Scatter()
|
||||
plot.add(result.F, color="red", label="Algorithm A")
|
||||
plot.add(ref_pareto_front, color="black", alpha=0.3, label="True PF")
|
||||
plot.show()
|
||||
|
||||
# 3D scatter plot
|
||||
plot = Scatter(title="3D Pareto Front")
|
||||
plot.add(result.F)
|
||||
plot.show()
|
||||
```
|
||||
|
||||
**Parameters:**
|
||||
- `title`: Plot title
|
||||
- `figsize`: Figure size tuple (width, height)
|
||||
- `legend`: Show legend (default: True)
|
||||
- `labels`: Axis labels list
|
||||
|
||||
**Add method parameters:**
|
||||
- `color`: Color specification
|
||||
- `alpha`: Transparency (0-1)
|
||||
- `s`: Marker size
|
||||
- `marker`: Marker style
|
||||
- `label`: Legend label
|
||||
|
||||
**N-dimensional projection:**
|
||||
For >3 objectives, automatically creates scatter plot matrix
|
||||
|
||||
### 2. Parallel Coordinate Plots (PCP)
|
||||
**Purpose:** Compare multiple solutions across many objectives
|
||||
**Best for:** Many-objective problems, comparing algorithm performance
|
||||
|
||||
**Mechanism:** Each vertical axis represents one objective, lines connect objective values for each solution
|
||||
|
||||
**Usage:**
|
||||
```python
|
||||
from pymoo.visualization.pcp import PCP
|
||||
|
||||
plot = PCP()
|
||||
plot.add(result.F, color="blue", alpha=0.5)
|
||||
plot.add(reference_set, color="red", alpha=0.8)
|
||||
plot.show()
|
||||
```
|
||||
|
||||
**Parameters:**
|
||||
- `title`: Plot title
|
||||
- `figsize`: Figure size
|
||||
- `labels`: Objective labels
|
||||
- `bounds`: Normalization bounds (min, max) per objective
|
||||
- `normalize_each_axis`: Normalize to [0,1] per axis (default: True)
|
||||
|
||||
**Best practices:**
|
||||
- Normalize for different objective scales
|
||||
- Use transparency for overlapping lines
|
||||
- Limit number of solutions for clarity (<1000)
|
||||
|
||||
### 3. Heatmap
|
||||
**Purpose:** Show solution density and distribution patterns
|
||||
**Best for:** Understanding solution clustering, identifying gaps
|
||||
|
||||
**Usage:**
|
||||
```python
|
||||
from pymoo.visualization.heatmap import Heatmap
|
||||
|
||||
plot = Heatmap(title="Solution Density")
|
||||
plot.add(result.F)
|
||||
plot.show()
|
||||
```
|
||||
|
||||
**Parameters:**
|
||||
- `bins`: Number of bins per dimension (default: 20)
|
||||
- `cmap`: Colormap name (e.g., "viridis", "plasma", "hot")
|
||||
- `norm`: Normalization method
|
||||
|
||||
**Interpretation:**
|
||||
- Bright regions: High solution density
|
||||
- Dark regions: Few or no solutions
|
||||
- Reveals distribution uniformity
|
||||
|
||||
### 4. Petal Diagram
|
||||
**Purpose:** Radial representation of multiple objectives
|
||||
**Best for:** Comparing individual solutions across objectives
|
||||
|
||||
**Structure:** Each "petal" represents one objective, length indicates objective value
|
||||
|
||||
**Usage:**
|
||||
```python
|
||||
from pymoo.visualization.petal import Petal
|
||||
|
||||
plot = Petal(title="Solution Comparison", bounds=[min_vals, max_vals])
|
||||
plot.add(result.F[0], color="blue", label="Solution 1")
|
||||
plot.add(result.F[1], color="red", label="Solution 2")
|
||||
plot.show()
|
||||
```
|
||||
|
||||
**Parameters:**
|
||||
- `bounds`: [min, max] per objective for normalization
|
||||
- `labels`: Objective names
|
||||
- `reverse`: Reverse specific objectives (for minimization display)
|
||||
|
||||
**Use cases:**
|
||||
- Decision making between few solutions
|
||||
- Presenting trade-offs to stakeholders
|
||||
|
||||
### 5. Radar Charts
|
||||
**Purpose:** Multi-criteria performance profiles
|
||||
**Best for:** Comparing solution characteristics
|
||||
|
||||
**Similar to:** Petal diagram but with connected vertices
|
||||
|
||||
**Usage:**
|
||||
```python
|
||||
from pymoo.visualization.radar import Radar
|
||||
|
||||
plot = Radar(bounds=[min_vals, max_vals])
|
||||
plot.add(solution_A, label="Design A")
|
||||
plot.add(solution_B, label="Design B")
|
||||
plot.show()
|
||||
```
|
||||
|
||||
### 6. Radviz
|
||||
**Purpose:** Dimensional reduction for visualization
|
||||
**Best for:** High-dimensional data exploration, pattern recognition
|
||||
|
||||
**Mechanism:** Projects high-dimensional points onto 2D circle, dimension anchors on perimeter
|
||||
|
||||
**Usage:**
|
||||
```python
|
||||
from pymoo.visualization.radviz import Radviz
|
||||
|
||||
plot = Radviz(title="High-dimensional Solution Space")
|
||||
plot.add(result.F, color="blue", s=30)
|
||||
plot.show()
|
||||
```
|
||||
|
||||
**Parameters:**
|
||||
- `endpoint_style`: Anchor point visualization
|
||||
- `labels`: Dimension labels
|
||||
|
||||
**Interpretation:**
|
||||
- Points near anchor: High value in that dimension
|
||||
- Central points: Balanced across dimensions
|
||||
- Clusters: Similar solutions
|
||||
|
||||
### 7. Star Coordinates
|
||||
**Purpose:** Alternative high-dimensional visualization
|
||||
**Best for:** Comparing multi-dimensional datasets
|
||||
|
||||
**Mechanism:** Each dimension as axis from origin, points plotted based on values
|
||||
|
||||
**Usage:**
|
||||
```python
|
||||
from pymoo.visualization.star_coordinate import StarCoordinate
|
||||
|
||||
plot = StarCoordinate()
|
||||
plot.add(result.F)
|
||||
plot.show()
|
||||
```
|
||||
|
||||
**Parameters:**
|
||||
- `axis_style`: Axis appearance
|
||||
- `axis_extension`: Axis length beyond max value
|
||||
- `labels`: Dimension labels
|
||||
|
||||
### 8. Video/Animation
|
||||
**Purpose:** Show optimization progress over time
|
||||
**Best for:** Understanding convergence behavior, presentations
|
||||
|
||||
**Usage:**
|
||||
```python
|
||||
from pymoo.visualization.video import Video
|
||||
|
||||
# Create animation from algorithm history
|
||||
anim = Video(result.algorithm)
|
||||
anim.save("optimization_progress.mp4")
|
||||
```
|
||||
|
||||
**Requirements:**
|
||||
- Algorithm must store history (use `save_history=True` in minimize)
|
||||
- ffmpeg installed for video export
|
||||
|
||||
**Customization:**
|
||||
- Frame rate
|
||||
- Plot type per frame
|
||||
- Overlay information (generation, hypervolume, etc.)
|
||||
|
||||
## Advanced Features
|
||||
|
||||
### Multiple Dataset Overlay
|
||||
|
||||
All plot types support adding multiple datasets:
|
||||
|
||||
```python
|
||||
plot = Scatter(title="Algorithm Comparison")
|
||||
plot.add(nsga2_result.F, color="red", alpha=0.5, label="NSGA-II")
|
||||
plot.add(nsga3_result.F, color="blue", alpha=0.5, label="NSGA-III")
|
||||
plot.add(true_pareto_front, color="black", linewidth=2, label="True PF")
|
||||
plot.show()
|
||||
```
|
||||
|
||||
### Custom Styling
|
||||
|
||||
Pass matplotlib kwargs directly:
|
||||
|
||||
```python
|
||||
plot = Scatter(
|
||||
title="My Results",
|
||||
figsize=(10, 8),
|
||||
tight_layout=True
|
||||
)
|
||||
plot.add(
|
||||
result.F,
|
||||
color="red",
|
||||
marker="o",
|
||||
s=50,
|
||||
alpha=0.7,
|
||||
edgecolors="black",
|
||||
linewidth=0.5
|
||||
)
|
||||
```
|
||||
|
||||
### Normalization
|
||||
|
||||
Normalize objectives to [0,1] for fair comparison:
|
||||
|
||||
```python
|
||||
plot = PCP(normalize_each_axis=True, bounds=[min_bounds, max_bounds])
|
||||
```
|
||||
|
||||
### Save to File
|
||||
|
||||
Save plots instead of displaying:
|
||||
|
||||
```python
|
||||
plot = Scatter()
|
||||
plot.add(result.F)
|
||||
plot.save("my_plot.png", dpi=300)
|
||||
```
|
||||
|
||||
## Visualization Selection Guide
|
||||
|
||||
**Choose visualization based on:**
|
||||
|
||||
| Problem Type | Primary Plot | Secondary Plot |
|
||||
|--------------|--------------|----------------|
|
||||
| 2-objective | Scatter | Heatmap |
|
||||
| 3-objective | 3D Scatter | Parallel Coordinates |
|
||||
| Many-objective (4-10) | Parallel Coordinates | Radviz |
|
||||
| Many-objective (>10) | Radviz | Star Coordinates |
|
||||
| Solution comparison | Petal/Radar | Parallel Coordinates |
|
||||
| Algorithm convergence | Video | Scatter (final) |
|
||||
| Distribution analysis | Heatmap | Scatter |
|
||||
|
||||
**Combinations:**
|
||||
- Scatter + Heatmap: Overall distribution + density
|
||||
- PCP + Petal: Population overview + individual solutions
|
||||
- Scatter + Video: Final result + convergence process
|
||||
|
||||
## Common Visualization Workflows
|
||||
|
||||
### 1. Algorithm Comparison
|
||||
```python
|
||||
from pymoo.visualization.scatter import Scatter
|
||||
|
||||
plot = Scatter(title="Algorithm Comparison on ZDT1")
|
||||
plot.add(ga_result.F, color="blue", label="GA", alpha=0.6)
|
||||
plot.add(nsga2_result.F, color="red", label="NSGA-II", alpha=0.6)
|
||||
plot.add(zdt1.pareto_front(), color="black", label="True PF")
|
||||
plot.show()
|
||||
```
|
||||
|
||||
### 2. Many-objective Analysis
|
||||
```python
|
||||
from pymoo.visualization.pcp import PCP
|
||||
|
||||
plot = PCP(
|
||||
title="5-objective DTLZ2 Results",
|
||||
labels=["f1", "f2", "f3", "f4", "f5"],
|
||||
normalize_each_axis=True
|
||||
)
|
||||
plot.add(result.F, alpha=0.3)
|
||||
plot.show()
|
||||
```
|
||||
|
||||
### 3. Decision Making
|
||||
```python
|
||||
from pymoo.visualization.petal import Petal
|
||||
|
||||
# Compare top 3 solutions
|
||||
candidates = result.F[:3]
|
||||
|
||||
plot = Petal(
|
||||
title="Top 3 Solutions",
|
||||
bounds=[result.F.min(axis=0), result.F.max(axis=0)],
|
||||
labels=["Cost", "Weight", "Efficiency", "Safety"]
|
||||
)
|
||||
for i, sol in enumerate(candidates):
|
||||
plot.add(sol, label=f"Solution {i+1}")
|
||||
plot.show()
|
||||
```
|
||||
|
||||
### 4. Convergence Visualization
|
||||
```python
|
||||
from pymoo.optimize import minimize
|
||||
|
||||
# Enable history
|
||||
result = minimize(
|
||||
problem,
|
||||
algorithm,
|
||||
('n_gen', 200),
|
||||
seed=1,
|
||||
save_history=True,
|
||||
verbose=False
|
||||
)
|
||||
|
||||
# Create convergence plot
|
||||
from pymoo.visualization.scatter import Scatter
|
||||
|
||||
plot = Scatter(title="Convergence Over Generations")
|
||||
for gen in [0, 50, 100, 150, 200]:
|
||||
F = result.history[gen].opt.get("F")
|
||||
plot.add(F, alpha=0.5, label=f"Gen {gen}")
|
||||
plot.show()
|
||||
```
|
||||
|
||||
## Tips and Best Practices
|
||||
|
||||
1. **Use appropriate alpha:** For overlapping points, use `alpha=0.3-0.7`
|
||||
2. **Normalize objectives:** Different scales? Normalize for fair visualization
|
||||
3. **Label clearly:** Always provide meaningful labels and legends
|
||||
4. **Limit data points:** >10000 points? Sample or use heatmap
|
||||
5. **Color schemes:** Use colorblind-friendly palettes
|
||||
6. **Save high-res:** Use `dpi=300` for publications
|
||||
7. **Interactive exploration:** Consider plotly for interactive plots
|
||||
8. **Combine views:** Show multiple perspectives for comprehensive analysis
|
||||
Reference in New Issue
Block a user