Run omicverse's CellPhoneDB v5 wrapper on annotated single-cell data to infer ligand-receptor networks and produce CellChat-style visualisations.
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.
omicverse>=0.2, scanpy, anndata, pandas, matplotlib, seaborn, and CellPhoneDB resources.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.ov.plot_set().ov.read(...).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")
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,
)
cpdb_results and adata_cpdb so downstream plotting can be repeated without rerunning permutations.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.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.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.CellChatViz directly when the user needs method-level controlcolor_dict = dict(zip(
adata.obs["cell_labels"].cat.categories,
adata.uns["cell_labels_colors"]
))
viz = ov.pl.CellChatViz(adata_cpdb, palette=color_dict)
viz.compute_aggregated_network(...) then viz.netVisual_circle(...).viz.compute_pathway_communication(...) then viz.get_significant_pathways_v2(...).viz.netVisual_heatmap_marsilea(...) or viz.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(...), and viz.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.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.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.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.adata.var["gene_a"] and adata.var["gene_b"].rotate_names=True when genes or cell-type labels are long.min_interaction_threshold to remove weak edges before plotting.viz.netAnalysis_computeCentrality() first when using the low-level API.pattern="incoming" and pattern="outgoing" separately if the user wants interpretable sender vs receiver programs.cpdb_file_path must point to a valid CellPhoneDB v5 SQLite zip.adata.var:classification is needed for pathway-filtered plotting.gene_a and gene_b are needed for gene-level or ligand-receptor-specific plots.marsilea for pathway_bubble, bubble_lr, focused heatmaps, and role-network Marsilea views.mpl-chord-diagram for chord plots.adjustText if label overlap is severe.adata.obs[celltype_key].cat.categories and the corresponding adata.uns[f"{celltype_key}_colors"].ov.pl.ccc_heatmap(..., plot_type='focused_heatmap') to show the strongest pathways."ov.pl.ccc_network_plot(..., plot_type='gene_chord')."plot_type='bubble_lr'."ccc_stat_plot(..., plot_type='pathway_summary') and plot_type='lr_contribution'."CellChatViz directly to compute centrality and render Marsilea role-network plots."t_cellphonedb.ipynbomicverse_guide/docs/Tutorials-single/data/cpdb/reference.md