single-cell-cellphonedb-communication-mapping
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:
marsileafor heatmap and bubble matrix plotters.mpl-chord-diagramfor chord diagrams.networkxfor diffusion and network-style plots.adjustTextif the user wants improved automatic label repulsion.
- Activate OmicVerse plotting defaults with
ov.plot_set().
- Use an environment with
- 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.
- Read the normalized expression matrix with
- 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_resultsandadata_cpdbso downstream plotting can be repeated without rerunning permutations.
- Use
- 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.plot_type="scatter"or"role_scatter"to compare outgoing versus incoming signaling roles.plot_type="role_network"or"role_network_marsilea"for matrix-style role summaries.plot_type="sankey"for communication flow summaries.
- Use
- Use
CellChatVizdirectly when the user needs method-level control- Create a stable palette mapping from cell labels:
color_dict = dict(zip( adata.obs["cell_labels"].cat.categories, adata.uns["cell_labels_colors"] )) viz = ov.pl.CellChatViz(adata_cpdb, palette=color_dict) - Recommended direct workflow:
viz.compute_aggregated_network(...)thenviz.netVisual_circle(...).viz.compute_pathway_communication(...)thenviz.get_significant_pathways_v2(...).viz.netVisual_heatmap_marsilea(...)orviz.netVisual_heatmap_marsilea_focused(...).viz.netVisual_bubble_marsilea(...)for pathway bubbles.viz.netVisual_bubble_lr(...)for selected ligand-receptor pairs.viz.netVisual_chord_cell(...),viz.netVisual_chord_gene(...), andviz.netVisual_chord_LR(...).viz.netVisual_individual(...)for one pathway / one enriched pair.viz.netAnalysis_computeCentrality()followed by role heatmap, scatter, and network plots.viz.netAnalysis_contribution(pathway)for pathway-level pair contribution analysis.viz.netVisual_diffusion(...)for pathway similarity structure.
- Create a stable palette mapping from cell labels:
- 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_summaryandlr_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.
- The newer additions worth surfacing in answers are:
- Parameter tips for the newer plots
- For pathway bubbles:
group_pathways=Truegroups by pathway rather than individual L-R pairs.transpose=Trueis useful when too many cell-pair rows make labels unreadable.add_violin=Truecan expose score distributions but makes figures denser.
- For ligand-receptor bubbles:
show_all_pairs=Trueis useful when the user wants to compare a fixed panel of pairs even if some are weak or absent.pair_lr_useorinteraction_useshould match the pair naming inadata.var.
- For gene chords:
- Require
adata.var["gene_a"]andadata.var["gene_b"]. - Use
rotate_names=Truewhen genes or cell-type labels are long.
- Require
- For focused heatmaps and focused circle plots:
- Tune
min_interaction_thresholdto remove weak edges before plotting.
- Tune
- For role plots:
- Run
viz.netAnalysis_computeCentrality()first when using the low-level API. - Use
pattern="incoming"andpattern="outgoing"separately if the user wants interpretable sender vs receiver programs.
- Run
- For pathway bubbles:
- Troubleshooting
- Metadata alignment: the communication grouping column must be categorical and free of missing values.
- Database bundle:
cpdb_file_pathmust 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:classificationis needed for pathway-filtered plotting.gene_aandgene_bare needed for gene-level or ligand-receptor-specific plots.
- Optional dependency errors:
- install
marsileaforpathway_bubble,bubble_lr, focused heatmaps, and role-network Marsilea views. - install
mpl-chord-diagramfor chord plots. - install
adjustTextif label overlap is severe.
- install
- Palette mismatches: rebuild the palette from sorted categories in
adata.obs[celltype_key].cat.categoriesand the correspondingadata.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')andplot_type='lr_contribution'." - "Use
CellChatVizdirectly to compute centrality and render Marsilea role-network plots."
References
- Tutorial notebook:
t_cellphonedb.ipynb - Example data:
omicverse_guide/docs/Tutorials-single/data/cpdb/ - Quick copy/paste commands:
reference.md
More from starlitnightly/omicverse
single-cell-downstream-analysis
AUCell pathway scoring, metacell DEG, scDrug response, SCENIC regulons, cNMF programs, and NOCD community detection in OmicVerse.
46single-cell-annotation-skills-with-omicverse
Cell type annotation: SCSA, MetaTiME, CellVote consensus, CellMatch, GPTAnno, weighted KNN label transfer in OmicVerse.
45bulk-rna-seq-deseq2-analysis-with-omicverse
PyDESeq2 differential expression: ID mapping, DE testing, fold-change thresholding, and GSEA enrichment visualization in OmicVerse.
44single-cell-preprocessing-with-omicverse
Single-cell QC, normalization, HVG detection, PCA, neighbor graph, UMAP/tSNE embedding pipelines in OmicVerse (CPU/GPU).
40data-export-pdf
Create professional PDF reports with text, tables, and embedded images using reportlab. Works with ANY LLM provider (GPT, Gemini, Claude, etc.).
38single-cell-multi-omics-integration
Multi-omics integration: MOFA factor analysis, GLUE unpaired alignment, SIMBA batch correction, TOSICA label transfer, StaVIA trajectory. Covers scRNA+scATAC paired/unpaired workflows.
38