WORKFLOW 08: Comprehensive Visualization#
This workflow demonstrates PEACH’s comprehensive visualization capabilities:
Archetypal space plots (2D and 3D)
Training metrics and diagnostics
Gene/pattern dotplots and heatmaps
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
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)
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
[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
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
======================================================================