WORKFLOW 08: Comprehensive Visualization#

This workflow demonstrates PEACH’s comprehensive visualization capabilities:

  1. Archetypal space plots (2D and 3D)

  2. Training metrics and diagnostics

  3. Gene/pattern dotplots and heatmaps

  4. Archetype statistics and summaries

All plotting functions save figures to the current directory and can optionally display them.

Example usage: python WORKFLOW_08.py

Requirements: - peach - scanpy - matplotlib - Trained model with results (from WORKFLOW_03-05)

[1]:
import scanpy as sc
import peach as pc
import matplotlib
import matplotlib.pyplot as plt
from pathlib import Path

# For Jupyter: enable inline display of matplotlib figures
# This makes figures display automatically without plt.show()
%matplotlib inline
anndata/__init__.py:44: FutureWarning: Importing read_csv from `anndata` is deprecated. Import anndata.io.read_csv instead.
  return module_get_attr_redirect(attr_name, deprecated_mapping=_DEPRECATED)
anndata/__init__.py:44: FutureWarning: Importing read_excel from `anndata` is deprecated. Import anndata.io.read_excel instead.
  return module_get_attr_redirect(attr_name, deprecated_mapping=_DEPRECATED)
anndata/__init__.py:44: FutureWarning: Importing read_hdf from `anndata` is deprecated. Import anndata.io.read_hdf instead.
  return module_get_attr_redirect(attr_name, deprecated_mapping=_DEPRECATED)
anndata/__init__.py:44: FutureWarning: Importing read_loom from `anndata` is deprecated. Import anndata.io.read_loom instead.
  return module_get_attr_redirect(attr_name, deprecated_mapping=_DEPRECATED)
anndata/__init__.py:44: FutureWarning: Importing read_mtx from `anndata` is deprecated. Import anndata.io.read_mtx instead.
  return module_get_attr_redirect(attr_name, deprecated_mapping=_DEPRECATED)
anndata/__init__.py:44: FutureWarning: Importing read_text from `anndata` is deprecated. Import anndata.io.read_text instead.
  return module_get_attr_redirect(attr_name, deprecated_mapping=_DEPRECATED)
anndata/__init__.py:44: FutureWarning: Importing read_umi_tools from `anndata` is deprecated. Import anndata.io.read_umi_tools instead.
  return module_get_attr_redirect(attr_name, deprecated_mapping=_DEPRECATED)

Configuration#

[ ]:
# Data path
data_path = Path("~/data/hsc_10k.h5ad")

# Training parameters
n_archetypes = 5
hidden_dims = [256, 128, 64]
n_epochs = 100
seed = 42

# Visualization settings
save_plots = True   # Save figures to files
show_plots = True   # Display interactively (we're in Jupyter)

NB: most visualization functions also have a 3D interactive Plotly render that will display when you run the code in addition to the matplotlib options.

Step 1: Prepare Complete Analysis (All Prerequisites)#

[3]:
print("Preparing complete analysis pipeline...")
adata = sc.read_h5ad(data_path)
print(f"  Shape: {adata.n_obs:,} cells × {adata.n_vars:,} genes")

# PCA
if 'X_pca' not in adata.obsm:
    print("  Running PCA...")
    sc.tl.pca(adata, n_comps=13)

# Train model
print(f"  Training model ({n_archetypes} archetypes, {n_epochs} epochs)...")
results = pc.tl.train_archetypal(
    adata,
    n_archetypes=n_archetypes,
    n_epochs=n_epochs,
    model_config={'hidden_dims': hidden_dims},
    early_stopping_patience=10,
    seed=seed,
    device='cpu',
)

# Compute coordinates and assign
print("  Computing coordinates and assignments...")
pc.tl.archetypal_coordinates(adata)
pc.tl.assign_archetypes(adata)

# Extract weights
print("  Extracting archetype weights...")
weights = pc.tl.extract_archetype_weights(adata)

# Compute gene associations
print("  Computing gene associations...")
gene_assoc = pc.tl.gene_associations(adata, obs_key='archetypes', verbose=False)

print("  Preparation complete!\n")
Preparing complete analysis pipeline...
  Shape: 10,000 cells × 2,500 genes
  Training model (5 archetypes, 100 epochs)...
[OK] Using specified PCA coordinates: adata.obsm['X_pca'] (10000, 50)
[STATS] DataLoader created: 10000 cells × 50 PCA components
   Config: batch_size=128, workers=0 (Apple Silicon)
Archetypes parameter registered: True
Archetypes requires_grad: True
Deep_AA (Deep Archetypal Analysis) initialized:
  - Single-stage architecture (like Deep_2)
  - Inflation factor: 1.5
  - Direct archetypal coordinates (no bottleneck)
 Initializing with PCHA + inflation_factor=1.5...

 Consolidated Archetype Initialization
   PCHA: True, Inflation: True (factor: 1.5)
   Test inflation: False
Running PCHA initialization...
  Input shape: (1000, 50)
  Target archetypes: 5
Running PCHA with 5 archetypes...
Data shape for PCHA: (50, 1000)
PCHA Results:
  Archetypes shape: (5, 50)
  Archetype R²: 0.4232
  SSE: 190334.1822
  PCHA archetype R²: 0.4232
  Archetype shape: (5, 50)
[OK] Initialized 5 archetypes using PCHA

 Scalar Archetypal Inflation (factor: 1.50)
   [OK] Inflation complete
      [STATS] Positioning verification:
         Data radius (max): 82.083
         Data radius (mean): 17.643
         Archetype distances: 15.606 to 33.271
         Archetypes outside data: 0/5
         Min archetype separation: 27.940
[OK] Archetype initialization complete (success: True)
[OK] PCHA + inflation initialization successful!
Starting training for 100 epochs...
Device: cpu
Archetypal weight: 1.0, KLD weight: 0.0, Reconstruction weight: 0.0
  (Model configured: arch=1.0, kld=0.0)
Tracking stability: True, Validating constraints: True
Intel MKL WARNING: Support of Intel(R) Streaming SIMD Extensions 4.2 (Intel(R) SSE4.2) enabled only processors has been deprecated. Intel oneAPI Math Kernel Library 2025.0 will require Intel(R) Advanced Vector Extensions (Intel(R) AVX) instructions.

Epoch 0 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0015, max=0.9556, mean=0.2000
Batch reconstruction MSE: 7.2739
Archetype stats: min=-14.2852, max=28.6526
Archetype gradients: norm=0.028922, mean=0.001403

Epoch 1/100
Average loss: 5.6358
Archetypal loss: 5.6358
KLD loss: 24.5237
Reconstruction loss: 5.6358
Archetype R²: 0.1602
fc_Y grad norm: 0.000000
Constraints satisfied: True
Constraint violation rate: 0.000
Archetype drift (mean): 0.000000

Epoch 5 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0010, max=0.9865, mean=0.2000
Batch reconstruction MSE: 4.2097
Archetype stats: min=-14.3396, max=28.7764
Archetype change since last debug: 2.189875
Archetype gradients: norm=0.108682, mean=0.005206

Epoch 10 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0056, max=0.9088, mean=0.2000
Batch reconstruction MSE: 4.0121
Archetype stats: min=-14.3338, max=28.7634
Archetype change since last debug: 0.429468
Archetype gradients: norm=0.053082, mean=0.002467

Epoch 11/100
Average loss: 3.6779
Archetypal loss: 3.6779
KLD loss: 5.5352
Reconstruction loss: 3.6779
Archetype R²: 0.4518
fc_Y grad norm: 0.000000
Constraints satisfied: True
Constraint violation rate: 0.000
Archetype drift (mean): 0.107450

Epoch 15 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0071, max=0.8411, mean=0.2000
Batch reconstruction MSE: 4.4657
Archetype stats: min=-14.3321, max=28.7442
Archetype change since last debug: 0.149557
Archetype gradients: norm=0.042884, mean=0.001477

Epoch 20 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0040, max=0.8350, mean=0.2000
Batch reconstruction MSE: 3.8393
Archetype stats: min=-14.3225, max=28.7308
Archetype change since last debug: 0.115992
Archetype gradients: norm=0.049464, mean=0.002404

Epoch 21/100
Average loss: 3.6716
Archetypal loss: 3.6716
KLD loss: 7.8350
Reconstruction loss: 3.6716
Archetype R²: 0.4531
fc_Y grad norm: 0.000000
Constraints satisfied: True
Constraint violation rate: 0.000
Archetype drift (mean): 0.049941

Epoch 25 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0079, max=0.8820, mean=0.2000
Batch reconstruction MSE: 3.4326
Archetype stats: min=-14.3132, max=28.7177
Archetype change since last debug: 0.121073
Archetype gradients: norm=0.067062, mean=0.003239

Epoch 30 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0121, max=0.8246, mean=0.2000
Batch reconstruction MSE: 3.9216
Archetype stats: min=-14.3068, max=28.7001
Archetype change since last debug: 0.109416
Archetype gradients: norm=0.026028, mean=0.001389

Epoch 31/100
Average loss: 3.6717
Archetypal loss: 3.6717
KLD loss: 9.6285
Reconstruction loss: 3.6717
Archetype R²: 0.4543
fc_Y grad norm: 0.000000
Constraints satisfied: True
Constraint violation rate: 0.000
Archetype drift (mean): 0.049335

Epoch 35 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0143, max=0.8389, mean=0.2000
Batch reconstruction MSE: 3.2347
Archetype stats: min=-14.3040, max=28.6959
Archetype change since last debug: 0.056059
Archetype gradients: norm=0.045435, mean=0.002042

Epoch 40 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0124, max=0.8144, mean=0.2000
Batch reconstruction MSE: 4.0808
Archetype stats: min=-14.3042, max=28.6969
Archetype change since last debug: 0.016479
Archetype gradients: norm=0.026807, mean=0.001320

Epoch 41/100
Average loss: 3.6476
Archetypal loss: 3.6476
KLD loss: 9.6005
Reconstruction loss: 3.6476
Archetype R²: 0.4562
fc_Y grad norm: 0.000000
Constraints satisfied: True
Constraint violation rate: 0.000
Archetype drift (mean): 0.007161

Epoch 45 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0106, max=0.8257, mean=0.2000
Batch reconstruction MSE: 3.9778
Archetype stats: min=-14.3047, max=28.6975
Archetype change since last debug: 0.015616
Archetype gradients: norm=0.035551, mean=0.001571

Epoch 50 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0144, max=0.7717, mean=0.2000
Batch reconstruction MSE: 4.0227
Archetype stats: min=-14.3061, max=28.6977
Archetype change since last debug: 0.018814
Archetype gradients: norm=0.038723, mean=0.001752

Epoch 51/100
Average loss: 3.6614
Archetypal loss: 3.6614
KLD loss: 9.6812
Reconstruction loss: 3.6614
Archetype R²: 0.4543
fc_Y grad norm: 0.000000
Constraints satisfied: True
Constraint violation rate: 0.000
Archetype drift (mean): 0.006860

Epoch 55 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0099, max=0.8260, mean=0.2000
Batch reconstruction MSE: 3.7852
Archetype stats: min=-14.3058, max=28.6984
Archetype change since last debug: 0.007191
Archetype gradients: norm=0.022427, mean=0.001057

Epoch 60 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0144, max=0.8380, mean=0.2000
Batch reconstruction MSE: 3.3732
Archetype stats: min=-14.3058, max=28.6988
Archetype change since last debug: 0.002289
Archetype gradients: norm=0.019941, mean=0.000807

Epoch 61/100
Average loss: 3.6589
Archetypal loss: 3.6589
KLD loss: 9.8121
Reconstruction loss: 3.6589
Archetype R²: 0.4548
fc_Y grad norm: 0.000000
Constraints satisfied: True
Constraint violation rate: 0.000
Archetype drift (mean): 0.000987

Epoch 65 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0138, max=0.8108, mean=0.2000
Batch reconstruction MSE: 3.4195
Archetype stats: min=-14.3058, max=28.6989
Archetype change since last debug: 0.000819
Archetype gradients: norm=0.032029, mean=0.001738

Epoch 70 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0068, max=0.7882, mean=0.2000
Batch reconstruction MSE: 3.6680
Archetype stats: min=-14.3058, max=28.6989
Archetype change since last debug: 0.000673
Archetype gradients: norm=0.018526, mean=0.000885

Epoch 71/100
Average loss: 3.6610
Archetypal loss: 3.6610
KLD loss: 10.0082
Reconstruction loss: 3.6610
Archetype R²: 0.4545
fc_Y grad norm: 0.000000
Constraints satisfied: True
Constraint violation rate: 0.000
Archetype drift (mean): 0.000243

Epoch 75 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0106, max=0.7933, mean=0.2000
Batch reconstruction MSE: 3.8791
Archetype stats: min=-14.3057, max=28.6989
Archetype change since last debug: 0.000608
Archetype gradients: norm=0.014598, mean=0.000725

Epoch 80 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0027, max=0.7935, mean=0.2000
Batch reconstruction MSE: 3.5438
Archetype stats: min=-14.3057, max=28.6989
Archetype change since last debug: 0.000082
Archetype gradients: norm=0.017615, mean=0.000936

Epoch 81/100
Average loss: 3.6582
Archetypal loss: 3.6582
KLD loss: 10.0278
Reconstruction loss: 3.6582
Archetype R²: 0.4548
fc_Y grad norm: 0.000000
Constraints satisfied: True
Constraint violation rate: 0.000
Archetype drift (mean): 0.000045

Epoch 85 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0126, max=0.7999, mean=0.2000
Batch reconstruction MSE: 3.9433
Archetype stats: min=-14.3057, max=28.6989
Archetype change since last debug: 0.000326
Archetype gradients: norm=0.029548, mean=0.001323

Epoch 90 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0131, max=0.7853, mean=0.2000
Batch reconstruction MSE: 3.5982
Archetype stats: min=-14.3057, max=28.6989
Archetype change since last debug: 0.000085
Archetype gradients: norm=0.036248, mean=0.001747

Epoch 91/100
Average loss: 3.6559
Archetypal loss: 3.6559
KLD loss: 10.0513
Reconstruction loss: 3.6559
Archetype R²: 0.4552
fc_Y grad norm: 0.000000
Constraints satisfied: True
Constraint violation rate: 0.000
Archetype drift (mean): 0.000019

Epoch 95 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0152, max=0.7886, mean=0.2000
Batch reconstruction MSE: 3.3059
Archetype stats: min=-14.3057, max=28.6989
Archetype change since last debug: 0.000015
Archetype gradients: norm=0.022764, mean=0.001083

Epoch 99 Debug:
z row sums (should be ~1.0): 1.0000 ± 0.0000
z stats: min=0.0130, max=0.7866, mean=0.2000
Batch reconstruction MSE: 3.5219
Archetype stats: min=-14.3057, max=28.6989
Archetype change since last debug: 0.000020
Archetype gradients: norm=0.022685, mean=0.001138

Epoch 100/100
Average loss: 3.6562
Archetypal loss: 3.6562
KLD loss: 10.1073
Reconstruction loss: 3.6562
Archetype R²: 0.4560
fc_Y grad norm: 0.000000
Constraints satisfied: True
Constraint violation rate: 0.000
Archetype drift (mean): 0.000008

============================================================
TRAINING COMPLETED
============================================================
   [OK] Stored archetype coordinates in adata.uns['archetype_coordinates']: torch.Size([5, 50])

Final Performance:
  loss: 3.6562 (range: 3.6441 - 5.6358)
  archetypal_loss: 3.6562 (range: 3.6441 - 5.6358)
  archetype_r2: 0.4560 (range: 0.1602 - 0.4571)

fc_Y Learning Summary:

Final Stability Metrics:
  archetype_drift_mean: 0.000008 (range: 0.000000 - 0.718340)
  archetype_variance_mean: 0.000000 (range: 0.000000 - 0.003610)

Final Constraint Status:
  A matrix sum error: 0.000000
  B matrix sum error: 0.000000
  Constraints satisfied: True
  Computing coordinates and assignments...
 Computing archetype distances in PCA space...
   Canonical reference: adata.obs.index (10000 cells)
   Found PCA coordinates: X_pca (10000, 50)
   Found archetype coordinates: archetype_coordinates (5, 50)
 Computing pairwise distances in PCA space...
[OK] Distance computation complete
   Distance matrix shape: (10000, 5)
[OK] Stored in AnnData:
   adata.obsm['archetype_distances']: (10000, 5) distance matrix
   adata.uns['archetype_positions']: (5, 50) archetype positions
   adata.uns['archetype_distance_info']: distance computation metadata

[STATS] Distance Statistics:
   Nearest archetype distribution:
      Archetype 0: 4557 cells (45.6%), mean distance: 17.9368
      Archetype 1: 3255 cells (32.5%), mean distance: 16.0726
      Archetype 2: 1406 cells (14.1%), mean distance: 18.1521
      Archetype 3: 540 cells (5.4%), mean distance: 21.9162
      Archetype 4: 242 cells (2.4%), mean distance: 18.2201
   Overall statistics:
      Mean nearest distance: 17.5820
      Distance range: [9.265, 87.139]
 AnnData-centric archetype binning...
   Distance matrix: (10000, 5) (from adata.obsm['archetype_distances'])
   Canonical cell reference: adata.obs.index (10000 cells)
   Selecting top 1000 cells (10.0%) per archetype
   INCLUDING central archetype_0 (generalist cells)
   Archetype 0 (central): 1000 cells, centroid distance range: [27.3433, 28.6058], mean: 28.2651
   Archetype 1: 1000 cells, distance range: [10.4835, 14.7888], mean: 13.5446
   Archetype 2: 1000 cells, distance range: [9.9644, 13.6308], mean: 12.6904
   Archetype 3: 1000 cells, distance range: [10.5411, 19.8681], mean: 16.1302
   Archetype 4: 1000 cells, distance range: [12.2873, 30.5595], mean: 24.8932
   Archetype 5: 1000 cells, distance range: [9.2645, 35.1578], mean: 29.4928

[STATS] Assignment Summary:
   Total cells: 10000
   Archetype 0 (central): 1000 cells (10.0%)
   Archetype 1: 1000 cells (10.0%)
   Archetype 2: 1000 cells (10.0%)
   Archetype 3: 1000 cells (10.0%)
   Archetype 4: 1000 cells (10.0%)
   Archetype 5: 1000 cells (10.0%)
   No archetype: 4997 cells (50.0%)
   [WARNING]  Overlapping assignments: 1866 cells

[OK] Stored assignments in adata.obs['archetypes']:
   Categories: ['archetype_0', 'archetype_1', 'archetype_2', 'archetype_3', 'archetype_4', 'archetype_5', 'no_archetype']
   no_archetype: 4997 cells (50.0%)
   archetype_3: 1000 cells (10.0%)
   archetype_4: 879 cells (8.8%)
   archetype_2: 854 cells (8.5%)
   archetype_5: 848 cells (8.5%)
   archetype_1: 826 cells (8.3%)
   archetype_0: 596 cells (6.0%)
  Extracting archetype weights...
[STATS] Using model from adata.uns['trained_model']
[STATS] Extracting weights for 10000 cells...
   PCA shape: (10000, 50)
   Device: cpu
   Batch size: 256
   Processed 10000/10000 cells...
[OK] Stored cell weights in adata.obsm['cell_archetype_weights']
   Shape: (10000, 5)
   Range: [0.003, 0.861]
   Mean sum: 1.0000

[STATS] Archetype weight statistics:
   Archetype 0: mean=0.174, std=0.190, max=0.840, dominant in 1248 cells
   Archetype 1: mean=0.098, std=0.103, max=0.673, dominant in 94 cells
   Archetype 2: mean=0.310, std=0.233, max=0.861, dominant in 3011 cells
   Archetype 3: mean=0.233, std=0.187, max=0.702, dominant in 1452 cells
   Archetype 4: mean=0.185, std=0.149, max=0.779, dominant in 693 cells
  Computing gene associations...
  Preparation complete!

Step 2: Archetypal Space Visualizations#

[4]:
print("Creating archetypal space plots...")

# 2D archetypal space (basic) - Plotly
print("  [1/3] 2D archetypal space...")
fig = pc.pl.archetypal_space(
    adata,
    color_by='archetypes',  # Color by archetype assignment
    save_path='archetypal_space_2d.png' if save_plots else None,
)
fig.show()

# 2D archetypal space with multiple colorings - Plotly
print("  [2/3] Multi-colored archetypal space...")
if 'cell_type' in adata.obs.columns:
    color_options = ['archetypes', 'cell_type']
else:
    color_options = ['archetypes']

# archetypal_space_multi expects a list of adata objects
fig = pc.pl.archetypal_space_multi(
    [adata],  # List of adata objects
    color_by=color_options,
    save_path='archetypal_space_multi.png' if save_plots else None,
)
fig.show()

# 3D archetypal space - Plotly
print("  [3/3] 3D archetypal space...")
fig = pc.pl.archetype_positions_3d(
    adata,
    save_path='archetypal_space_3d.png' if save_plots else None,
)
fig.show()
Creating archetypal space plots...
  [1/3] 2D archetypal space...
[OK] 3D visualization saved to: archetypal_space_2d.png

Data type cannot be displayed: application/vnd.plotly.v1+json

  [2/3] Multi-colored archetypal space...
[OK] Multi-dataset 3D visualization saved to: archetypal_space_multi.png

Data type cannot be displayed: application/vnd.plotly.v1+json

  [3/3] 3D archetypal space...
[OK] Figure saved to: archetypal_space_3d.png
/var/folders/9j/_p_812p579797bv1xx4zdptx65_s90/T/ipykernel_50567/293071693.py:33: UserWarning:

FigureCanvasAgg is non-interactive, and thus cannot be shown

../_images/tutorials_08_visualization_8_6.png

Step 3: Training Diagnostics#

[6]:
print("Creating training diagnostic plots...")

# Training metrics over time (Plotly figure)
# display=True shows the plot AND returns the figure
fig = pc.pl.training_metrics(
    results['history'],
    display=show_plots,  # Show if in interactive mode
)
# if save_plots and fig is not None:
#     fig.write_image('training_metrics.png')
#     print("      Saved: training_metrics.png")
Creating training diagnostic plots...

Data type cannot be displayed: application/vnd.plotly.v1+json

Step 4: Gene/Pattern Visualizations#

[7]:
print("\nCreating gene association plots...")

# Dotplot of top genes per archetype
print("  [1/2] Gene dotplot...")

# PEACH dotplot uses gene_associations DataFrame
fig = pc.pl.dotplot(
    gene_assoc,  # Results DataFrame from gene_associations
    x_col='archetype',
    y_col='gene',
    top_n_per_group=10,  # Top 10 genes per archetype
    title='Gene-Archetype Associations',
)
if save_plots:
    fig.savefig('gene_dotplot.png', dpi=150, bbox_inches='tight')
    print("      Saved: gene_dotplot.png")
# With %matplotlib inline, figures display automatically

# Pattern heatmap
print("  [2/2] Pattern heatmap...")
# Note: Requires pattern analysis (conditional_associations, etc.)
# pattern_results = pc.tl.pattern_analysis(adata, ...)
# fig = pc.pl.pattern_heatmap(pattern_results, save_path='pattern_heatmap.png' if save_plots else None)
# if show_plots: fig.show()
print("      (Requires pattern_results from pattern_analysis)")

Creating gene association plots...
  [1/2] Gene dotplot...
      Saved: gene_dotplot.png
  [2/2] Pattern heatmap...
      (Requires pattern_results from pattern_analysis)
../_images/tutorials_08_visualization_12_1.png

Step 5: Archetype Statistics#

[8]:
print("Archetype Statistics and Positions")
print("=" * 50)

# Archetype statistics summary (returns dict, not a plot)
print("\n[1/3] Computing archetype statistics...")
stats = pc.pl.archetype_statistics(adata)
print(f"      Computed {len(stats)} statistics keys")
Archetype Statistics and Positions
==================================================

[1/3] Computing archetype statistics...
[STATS] Archetype Statistics
==================================================
Number of archetypes: 5
Embedding dimensions: 50

Distance statistics:
  Mean distance: 40.5274
  Std distance:  5.2711
  Min distance:  28.6883
  Max distance:  47.4993
  Range:         18.8110

Nearest archetypes:  A1 - A2
Farthest archetypes: A3 - A4
      Computed 12 statistics keys
[9]:
# [2/3] Archetype positions in PCA space (Matplotlib)
print("\nArchetype Positions - 2D Matplotlib")
fig = pc.pl.archetype_positions(
    adata,
    save_path='archetype_positions_2d.png' if save_plots else None,
)
# With %matplotlib inline, figure displays automatically

Archetype Positions - 2D Matplotlib
[OK] Figure saved to: archetype_positions_2d.png
../_images/tutorials_08_visualization_15_1.png
[10]:
# [3/3] Archetype positions in 3D PCA space (Plotly)
print("\nArchetype Positions - 3D Plotly")
fig = pc.pl.archetype_positions_3d(
    adata,
    save_path='archetype_positions_3d.png' if save_plots else None,
)
# Display the plotly figure
fig.show()

Archetype Positions - 3D Plotly
[OK] Figure saved to: archetype_positions_3d.png
/var/folders/9j/_p_812p579797bv1xx4zdptx65_s90/T/ipykernel_50567/1994332550.py:8: UserWarning:

FigureCanvasAgg is non-interactive, and thus cannot be shown

../_images/tutorials_08_visualization_16_2.png

Step 6: CellRank Visualizations (if available)#

[11]:
print("\n" + "="*70)
print("WORKFLOW 08 COMPLETE")
print("="*70)
print("\nVisualizations created:")
if save_plots:
    print("  Archetypal Space (Plotly):")
    print("    - archetypal_space_2d.png")
    print("    - archetypal_space_multi.png")
    print("    - archetypal_space_3d.png")
    print("  Training Diagnostics (Plotly):")
    print("    - training_metrics.png")
    print("  Gene Associations (Matplotlib):")
    print("    - gene_dotplot.png")
    print("  Archetype Positions:")
    print("    - archetype_positions_2d.png (Matplotlib)")
    print("    - archetype_positions_3d.png (Plotly)")
    print("\n  All plots saved to current directory")

print("\nVisualization functions used:")
print("  Plotly (interactive):")
print("    - pc.pl.archetypal_space()")
print("    - pc.pl.archetypal_space_multi()")
print("    - pc.pl.archetype_positions_3d()")
print("    - pc.pl.training_metrics()")
print("  Matplotlib (static):")
print("    - pc.pl.dotplot()")
print("    - pc.pl.archetype_positions()")
print("  Statistics (dict):")
print("    - pc.pl.archetype_statistics()")

print("\nComplete!")
print("="*70)

======================================================================
WORKFLOW 08 COMPLETE
======================================================================

Visualizations created:
  Archetypal Space (Plotly):
    - archetypal_space_2d.png
    - archetypal_space_multi.png
    - archetypal_space_3d.png
  Training Diagnostics (Plotly):
    - training_metrics.png
  Gene Associations (Matplotlib):
    - gene_dotplot.png
  Archetype Positions:
    - archetype_positions_2d.png (Matplotlib)
    - archetype_positions_3d.png (Plotly)

  All plots saved to current directory

Visualization functions used:
  Plotly (interactive):
    - pc.pl.archetypal_space()
    - pc.pl.archetypal_space_multi()
    - pc.pl.archetype_positions_3d()
    - pc.pl.training_metrics()
  Matplotlib (static):
    - pc.pl.dotplot()
    - pc.pl.archetype_positions()
  Statistics (dict):
    - pc.pl.archetype_statistics()

Complete!
======================================================================

Summary#

[12]:
print("\n" + "="*70)
print("WORKFLOW 08 COMPLETE")
print("="*70)
print("Visualizations created:")
if save_plots:
    print("  • archetypal_space_2d.png - Basic 2D projection")
    print("  • archetypal_space_multi.png - Multiple colorings")
    print("  • archetypal_space_3d.png - 3D interactive view")
    print("  • training_metrics.png - Training history")
    print("  • gene_dotplot.png - Top genes per archetype")
    print("  • archetype_statistics.png - Statistical summary")
    print("  • archetype_positions.png - Positions in PCA space")
    print("\n  All plots saved to current directory")
else:
    print("  Plots generated (save_plots=False)")

print("\nVisualization functions used:")
print("  • pc.pl.archetypal_space() - 2D projections")
print("  • pc.pl.archetypal_space_multi() - Multiple views")
print("  • pc.pl.archetype_positions_3d() - 3D interactive")
print("  • pc.pl.training_metrics() - Training diagnostics")
print("  • pc.pl.dotplot() - Gene expression patterns")
print("  • pc.pl.archetype_statistics() - Summary statistics")

print("\nComplete PEACH workflow finished!")
print("See docs/INDEX.md for full documentation")
print("="*70)

======================================================================
WORKFLOW 08 COMPLETE
======================================================================
Visualizations created:
  • archetypal_space_2d.png - Basic 2D projection
  • archetypal_space_multi.png - Multiple colorings
  • archetypal_space_3d.png - 3D interactive view
  • training_metrics.png - Training history
  • gene_dotplot.png - Top genes per archetype
  • archetype_statistics.png - Statistical summary
  • archetype_positions.png - Positions in PCA space

  All plots saved to current directory

Visualization functions used:
  • pc.pl.archetypal_space() - 2D projections
  • pc.pl.archetypal_space_multi() - Multiple views
  • pc.pl.archetype_positions_3d() - 3D interactive
  • pc.pl.training_metrics() - Training diagnostics
  • pc.pl.dotplot() - Gene expression patterns
  • pc.pl.archetype_statistics() - Summary statistics

Complete PEACH workflow finished!
See docs/INDEX.md for full documentation
======================================================================