| name | bio-single-cell-cell-communication |
| description | Infer cell-cell communication networks from scRNA-seq data using CellChat, NicheNet, and LIANA for ligand-receptor interaction analysis. Use when inferring ligand-receptor interactions between cell types. |
| tool_type | mixed |
| primary_tool | CellChat |
Version Compatibility
Reference examples tested with: ggplot2 3.5+, scanpy 1.10+
Before using code patterns, verify installed versions match. If versions differ:
- Python:
pip show <package> then help(module.function) to check signatures
- R:
packageVersion('<pkg>') then ?function_name to verify parameters
If code throws ImportError, AttributeError, or TypeError, introspect the installed
package and adapt the example to match the actual API rather than retrying.
Cell-Cell Communication Analysis
"Infer cell-cell communication from my scRNA-seq data" → Predict ligand-receptor interactions between cell types and visualize intercellular signaling networks.
- R:
CellChat::createCellChat() → computeCommunProb() → netAnalysis()
- Python:
liana.method.cellchat() (LIANA framework)
CellChat (R)
Goal: Infer and quantify intercellular communication networks from scRNA-seq data using curated ligand-receptor databases.
Approach: Create a CellChat object from a Seurat object with cell type labels, select a signaling database subset, identify overexpressed ligands/receptors, compute communication probabilities using the trimean method, then aggregate into pathway-level networks.
library(CellChat)
library(Seurat)
cellchat <- createCellChat(object = seurat_obj, group.by = 'cell_type')
CellChatDB <- CellChatDB.human
cellchat@DB <- CellChatDB
CellChatDB.use <- subsetDB(CellChatDB, search = 'Secreted Signaling')
cellchat@DB <- CellChatDB.use
cellchat <- subsetData(cellchat)
cellchat <- identifyOverExpressedGenes(cellchat)
cellchat <- identifyOverExpressedInteractions(cellchat)
cellchat <- computeCommunProb(cellchat, type = 'triMean')
cellchat <- filterCommunication(cellchat, min.cells = 10)
cellchat computeCommunProbPathwaycellchat
cellchat aggregateNetcellchat
CellChat Visualization
netVisual_circle(cellchat@net$count, vertex.weight = groupSize, weight.scale = TRUE,
label.edge = FALSE, title.name = 'Number of interactions')
netVisual_circle(cellchat@net$weight, vertex.weight = groupSize, weight.scale = TRUE,
label.edge = FALSE, title.name = 'Interaction strength')
netVisual_heatmap(cellchat, color.heatmap = 'Reds')
netVisual_aggregate(cellchat, signaling = 'WNT', layout = 'circle')
netVisual_aggregate(cellchat, signaling = 'WNT', layout = 'chord'
netVisual_bubblecellchat sources.use targets.use
remove.isolate
netVisual_chord_genecellchat sources.use targets.use
lab.cex legend.pos.x
CellChat Pathway Analysis
cellchat <- netAnalysis_computeCentrality(cellchat, slot.name = 'netP')
netAnalysis_signalingRole_heatmap(cellchat, signaling = c('WNT', 'TGFb', 'BMP'))
netAnalysis_signalingRole_scatter(cellchat)
rankNet(cellchat, mode = 'comparison', stacked = TRUE, do.stat = TRUE)
Compare Conditions (CellChat)
cellchat_ctrl <- createCellChat(subset(seurat_obj, condition == 'control'), group.by = 'cell_type')
cellchat_treat <- createCellChat(subset(seurat_obj, condition == 'treatment'), group.by = 'cell_type')
cellchat_list <- list(Control = cellchat_ctrl, Treatment = cellchat_treat)
cellchat_merged <- mergeCellChat(cellchat_list, add.names = names(cellchat_list))
compareInteractions(cellchat_merged, show.legend = FALSE)
netVisual_diffInteraction(cellchat_merged, weight.scale =
netVisual_heatmapcellchat_merged
rankNetcellchat_merged mode stacked
NicheNet (R)
library(nichenetr)
library(Seurat)
library(tidyverse)
ligand_target_matrix <- readRDS('ligand_target_matrix.rds')
lr_network <- readRDS('lr_network.rds')
weighted_networks <- readRDS('weighted_networks.rds')
sender_celltypes <- c('Macrophage', 'Dendritic')
receiver <- 'T_cell'
expressed_genes_sender <- get_expressed_genes(sender_celltypes, seurat_obj, pct = 0.10)
expressed_genes_receiver <- get_expressed_genes(receiver, seurat_obj, pct = 0.10)
geneset_oi <- FindMarkers(seurat_obj, ident.1 = 'activated_T', ident.2
filterp_val_adj avg_log2FC rownames
background_genes expressed_genes_receiver
ligands lr_network pullfrom unique
expressed_ligands intersectligands expressed_genes_sender
receptors lr_network pullto unique
expressed_receptors intersectreceptors expressed_genes_receiver
potential_ligands lr_network
filterfrom expressed_ligands to expressed_receptors
pullfrom unique
ligand_activities predict_ligand_activities
geneset geneset_oi
background_expressed_genes background_genes
ligand_target_matrix ligand_target_matrix
potential_ligands potential_ligands
best_ligands ligand_activities top_n pearson arrangepearson pulltest_ligand
NicheNet Visualization
active_ligand_target_links <- best_ligands %>%
lapply(get_weighted_ligand_target_links, geneset_oi, ligand_target_matrix, n = 200) %>%
bind_rows() %>% drop_na()
vis_ligand_target <- prepare_ligand_target_visualization(
ligand_target_df = active_ligand_target_links,
ligand_target_matrix = ligand_target_matrix,
cutoff = 0.33
)
p_ligand_target <- vis_ligand_target %>%
make_heatmap_ggplot('Prioritized ligands', 'Target genes',
color = 'purple', legend_position = 'top')
lr_network_top <- lr_network %>%
filter(from %in% best_ligands & to %in% expressed_receptors) %>%
distinct(from, to)
vis_ligand_receptor get_exprs_avgseurat_obj
inner_joinlr_network_top by
p_ligand_receptor vis_ligand_receptor
make_heatmap_ggplot color
p_ligand_expression DotPlotseurat_obj features best_ligands cols
RotatedAxis
LIANA (Python)
import liana as li
import scanpy as sc
adata = sc.read_h5ad('adata.h5ad')
li.mt.rank_aggregate(adata, groupby='cell_type', resource_name='consensus',
expr_prop=0.1, verbose=True)
liana_results = adata.uns['liana_res']
sig_interactions = liana_results[liana_results['liana_rank'] < 0.01]
li.pl.dotplot(adata, colour='magnitude_rank', size='specificity_rank',
source_groups=['Macrophage'], target_groups=['T_cell'])
LIANA with Tensor Decomposition
li.mt.rank_aggregate(adata, groupby='cell_type', resource_name='consensus',
use_raw=False, verbose=True)
li.multi.build_tensor(adata, sample_key='sample', groupby='cell_type',
ligand_key='ligand_complex', receptor_key='receptor_complex')
li.multi.decompose_tensor(adata, n_components=5)
li.pl.factor_loadings(adata, factor_idx=0)
Related Skills
- single-cell/clustering - Define cell types first
- single-cell/trajectory-inference - Communication along trajectory
- spatial-transcriptomics/spatial-communication - Spatial context
- pathway-analysis/go-enrichment - Pathway enrichment of targets