| name | single-cell-cellphonedb-communication-mapping |
| title | Single-cell CellPhoneDB communication mapping |
| description | CellPhoneDB v5 ligand-receptor analysis, CellChatViz plots, and the newer ccc_heatmap / ccc_network_plot / ccc_stat_plot communication visualizations in OmicVerse. |
Single-cell CellPhoneDB communication mapping
Overview
Apply this skill when a user wants to quantify ligand-receptor communication between annotated single-cell populations and visualize the result with OmicVerse's CellPhoneDB plotting stack. This skill now covers both the original low-level ov.pl.CellChatViz workflow and the newer public plotting APIs:
ov.pl.ccc_heatmap(...)
ov.pl.ccc_network_plot(...)
ov.pl.ccc_stat_plot(...)
Use the ccc_* functions by default when the goal is to quickly generate publication-ready plots with a stable public API. Drop down to CellChatViz when the user needs method-level control or wants to combine several custom visualizations in one notebook.
Instructions
- Prepare the environment
- Use an environment with
omicverse>=0.2, scanpy, anndata, pandas, matplotlib, seaborn, and CellPhoneDB resources.
- For the newer visualizations, also ensure these optional plotting dependencies are available when needed:
marsilea for heatmap and bubble matrix plotters.
mpl-chord-diagram for chord diagrams.
networkx for diffusion and network-style plots.
adjustText if the user wants improved automatic label repulsion.
- Activate OmicVerse plotting defaults with
ov.plot_set().
- Load and validate the annotated AnnData
- Read the normalized expression matrix with
ov.read(...).
- Keep the communication grouping column clean, categorical, and aligned with the intended identities.
- Recommended checks:
celltype_key = "cell_labels"
assert celltype_key in adata.obs.columns, f"{celltype_key} missing from adata.obs"
adata.obs[celltype_key] = adata.obs[celltype_key].astype("category").cat.remove_unused_categories()
assert not adata.obs[celltype_key].isna().any(), f"NaN values found in {celltype_key}"
min_per_group = adata.obs[celltype_key].value_counts().min()
if min_per_group < 10:
print(f"WARNING: smallest group has {min_per_group} cells; sparse groups may destabilize permutations")
- Confirm the matrix is log-normalized before running CellPhoneDB. Raw counts can distort permutation-based significance.
- Run CellPhoneDB through OmicVerse
- Use
ov.single.run_cellphonedb_v5(...) and persist the outputs:
cpdb_results, adata_cpdb = ov.single.run_cellphonedb_v5(
adata,
cpdb_file_path="./cellphonedb.zip",
celltype_key="cell_labels",
min_cell_fraction=0.005,
min_genes=200,
min_cells=3,
iterations=1000,
threshold=0.1,
pvalue=0.05,
threads=10,
output_dir="./cpdb_results",
cleanup_temp=True,
)
- Save
cpdb_results and adata_cpdb so downstream plotting can be repeated without rerunning permutations.
- Prefer the new public plotting APIs for standard visualization requests
- Use
ov.pl.ccc_heatmap(...) for matrix-like plots:
plot_type="heatmap" for aggregated pathway-level communication.
plot_type="focused_heatmap" to highlight stronger interactions after thresholding weak entries.
plot_type="dot" or "bubble" for interaction-level summaries.
plot_type="pathway_bubble" for pathway-focused Marsilea bubble summaries.
plot_type="bubble_lr" for ligand-receptor-pair-specific bubble matrices.
plot_type="role_heatmap", "role_network", or "role_network_marsilea" for signaling role summaries.
plot_type="diff_heatmap" when comparing two communication AnnData objects.
- Use
ov.pl.ccc_network_plot(...) for graph-like plots:
plot_type="circle" or "circle_focused" for global communication networks.
plot_type="individual_outgoing" / "individual_incoming" for sender- or receiver-centric circle panels.
plot_type="individual" for a single pathway and optionally a selected L-R pair.
plot_type="chord" for cell-type-level pathway chords.
plot_type="gene_chord" for gene-level chord diagrams across pathway-specific ligand and receptor nodes.
plot_type="lr_chord" for specified ligand-receptor pairs.
plot_type="diffusion" for pathway similarity and diffusion-style network structure.
plot_type="diff_network" when comparing two communication objects.
plot_type="bipartite", "arrow", "sigmoid", or "embedding_network" for alternative layouts.
- Use
ov.pl.ccc_stat_plot(...) for statistics and summary panels:
plot_type="pathway_summary" to rank pathways by communication strength and significance.
plot_type="lr_contribution" to show the dominant ligand-receptor pairs within a pathway.
- Use
CellChatViz directly when the user needs method-level control
- Highlight the new visualization capabilities clearly
- The newer additions worth surfacing in answers are:
gene_chord: gene-level chord diagrams, not just cell-type-level chords.
bubble_lr: Marsilea bubble summaries centered on explicit ligand-receptor pairs.
focused_heatmap: thresholded pathway heatmaps that suppress weak interactions.
role_network_marsilea: richer role summaries with dendrograms, color bars, and importance bars.
diffusion: pathway similarity network based on communication patterns.
pathway_summary and lr_contribution: higher-level summary/statistical views for prioritization.
- When the user says "new visualization", prioritize demonstrating one of these rather than only the legacy circle plot.
- Parameter tips for the newer plots
- For pathway bubbles:
group_pathways=True groups by pathway rather than individual L-R pairs.
transpose=True is useful when too many cell-pair rows make labels unreadable.
add_violin=True can expose score distributions but makes figures denser.
- For ligand-receptor bubbles:
show_all_pairs=True is useful when the user wants to compare a fixed panel of pairs even if some are weak or absent.
pair_lr_use or interaction_use should match the pair naming in adata.var.
- For gene chords:
- Require
adata.var["gene_a"] and adata.var["gene_b"].
- Use
rotate_names=True when genes or cell-type labels are long.
- For focused heatmaps and focused circle plots:
- Tune
min_interaction_threshold to remove weak edges before plotting.
- For role plots:
- Run
viz.netAnalysis_computeCentrality() first when using the low-level API.
- Use
pattern="incoming" and pattern="outgoing" separately if the user wants interpretable sender vs receiver programs.
- Troubleshooting
- Metadata alignment: the communication grouping column must be categorical and free of missing values.
- Database bundle:
cpdb_file_path must point to a valid CellPhoneDB v5 SQLite zip.
- Sparse groups: very small sender or receiver groups often cause unstable or empty outputs.
- Missing columns in
adata.var:
classification is needed for pathway-filtered plotting.
gene_a and gene_b are needed for gene-level or ligand-receptor-specific plots.
- Optional dependency errors:
- install
marsilea for pathway_bubble, bubble_lr, focused heatmaps, and role-network Marsilea views.
- install
mpl-chord-diagram for chord plots.
- install
adjustText if label overlap is severe.
- Palette mismatches: rebuild the palette from sorted categories in
adata.obs[celltype_key].cat.categories and the corresponding adata.uns[f"{celltype_key}_colors"].
Examples
- "Run CellPhoneDB and then use
ov.pl.ccc_heatmap(..., plot_type='focused_heatmap') to show the strongest pathways."
- "Create a gene-level chord diagram for FGF signaling with
ov.pl.ccc_network_plot(..., plot_type='gene_chord')."
- "Compare selected ligand-receptor pairs across sender-receiver combinations with
plot_type='bubble_lr'."
- "Summarize the top pathways and then rank within-pathway ligand-receptor contributions with
ccc_stat_plot(..., plot_type='pathway_summary') and plot_type='lr_contribution'."
- "Use
CellChatViz directly to compute centrality and render Marsilea role-network plots."
References