Intercellular Communication Analysis with OmnipathR

Introduction

Cell-cell communication is fundamental to multicellular organism function, coordinating processes from development to immune response. OmnipathR provides comprehensive access to ligand-receptor interactions and intercellular communication annotations, enabling systematic analysis of cellular crosstalk.

Biological Context

Intercellular signaling involves:

  1. Ligands: Secreted or membrane-bound signaling molecules
  2. Receptors: Cell surface proteins that receive signals
  3. Downstream signaling: Intracellular cascades triggered by receptor activation
┌─────────────────┐                    ┌─────────────────┐
│   Sender Cell   │                    │  Receiver Cell  │
│                 │                    │                 │
│  ┌───────────┐  │    Ligand          │  ┌───────────┐  │
│  │  Ligand   │──┼───────────────────►│  │ Receptor  │  │
│  │  Gene     │  │                    │  │           │  │
│  └───────────┘  │                    │  └─────┬─────┘  │
│                 │                    │        │        │
│                 │                    │        ▼        │
│                 │                    │  ┌───────────┐  │
│                 │                    │  │ Signaling │  │
│                 │                    │  │  Cascade  │  │
│                 │                    │  └───────────┘  │
└─────────────────┘                    └─────────────────┘

Setup

library(OmnipathR)
library(dplyr)
library(tidyr)
library(ggplot2)

Intercellular Communication Database

Overview of Intercell Categories

OmnipathR organizes intercellular communication roles into a hierarchical system:

# Get all intercell categories
categories <- intercell_categories()

# View category summary
cat("Total categories:", length(categories), "\n")
#> Total categories: 833

# Show main categories
cat("\nSample categories:\n")
#> 
#> Sample categories:
head(categories, 20)
#>  [1] "5ht_gprotein"                 "5ht_ionotropic"               "7d_cadherin"                 
#>  [4] "7tm_a"                        "7tm_a_ogr1_gpr4_7tm_a"        "7tm_a_orphan_7tm_a"          
#>  [7] "7tm_b"                        "7tm_c"                        "7tm_d"                       
#> [10] "7tm_d_olfactory_7tm_d"        "7tm_type_b_polypeptide_7tm_b" "abc"                         
#> [13] "abca"                         "abcb"                         "abcc"                        
#> [16] "abcg"                         "acid_sensing"                 "act_tgfb"                    
#> [19] "actin_regulation_adhesome"    "activating_cofactor"

Category Types

Category Description Examples
Ligand Secreted signaling molecules Cytokines, growth factors
Receptor Signal-receiving proteins RTKs, GPCRs
ECM Extracellular matrix components Collagens, laminins
Adhesion Cell adhesion molecules Integrins, cadherins
Transporter Membrane transporters Ion channels, ABC transporters

Retrieving Intercell Data

Basic Intercell Annotations

# Get intercell annotations
intercell_data <- intercell()

cat("Total intercell records:", nrow(intercell_data), "\n")
#> Total intercell records: 388239

# Summary of categories
category_counts <- intercell_data %>%
    count(category, sort = TRUE)

head(category_counts, 15)
#> # A tibble: 15 × 2
#>    category                           n
#>    <chr>                          <int>
#>  1 intracellular                 162594
#>  2 transmembrane                  51903
#>  3 receptor                       35316
#>  4 plasma_membrane                15891
#>  5 secreted                       15858
#>  6 ligand                         15698
#>  7 ecm                            10459
#>  8 cell_surface                   10438
#>  9 extracellular                   9443
#> 10 plasma_membrane_transmembrane   7902
#> 11 cell_adhesion                   4845
#> 12 gpcr                            4370
#> 13 adhesion                        2964
#> 14 cell_surface_ligand             2664
#> 15 ion_channel                     2160

Category Distribution Visualization

# Visualize top categories
top_categories <- category_counts %>% head(12)

ggplot(top_categories, aes(x = reorder(category, n), y = n, fill = category)) +
    geom_col(alpha = 0.8) +
    coord_flip() +
    scale_fill_viridis_d(guide = "none") +
    labs(
        title = "Intercellular Communication Categories",
        subtitle = "Number of annotated proteins per category",
        x = "Category",
        y = "Number of Proteins"
    ) +
    theme_minimal() +
    theme(
        plot.title = element_text(face = "bold", size = 14),
        axis.text.y = element_text(size = 9)
    )
Distribution of proteins across major intercellular communication categories.

Distribution of proteins across major intercellular communication categories.

Ligand-Receptor Interactions

Curated Ligand-Receptor Database

# Get curated ligand-receptor interactions
lr_interactions <- tryCatch(
    curated_ligand_receptor_interactions(),
    error = function(e) {
        message("Note: Unable to fetch data from OmniPath server: ", e$message)
        # Return sample data structure for demonstration
        data.frame(
            source_genesymbol = c("TGFB1", "WNT3A", "FGF2", "EGF", "VEGFA"),
            target_genesymbol = c("TGFBR1", "FZD1", "FGFR1", "EGFR", "KDR"),
            sources = rep("CellPhoneDB", 5)
        )
    }
)

cat("Total L-R pairs:", nrow(lr_interactions), "\n")
#> Total L-R pairs: 6744

# View example interactions
lr_interactions %>%
    select(source_genesymbol, target_genesymbol, sources) %>%
    head(10)
#> # A tibble: 10 × 3
#>    source_genesymbol target_genesymbol sources                                                                
#>    <chr>             <chr>             <chr>                                                                  
#>  1 JAG2              NOTCH1            iTALK;Kirouac2010;KEGG-MEDICUS;ICELLNET;SIGNOR;CellPhoneDB_Cellinker;S…
#>  2 IL22              IL10RB            iTALK;SIGNOR;HINT;SignaLink3;UniProt_LRdb;Lit-BM-17;HPRD_LRdb;talklr;s…
#>  3 EPO               EPOR              iTALK;Kirouac2010;KEGG-MEDICUS;Guide2Pharma_LRdb;ICELLNET;SIGNOR;HINT;…
#>  4 CXCL16            CXCR6             iTALK;Kirouac2010;Guide2Pharma_LRdb;ICELLNET;HINT;HPMR_talklr;HPMR;Cel…
#>  5 KITLG             KIT               iTALK;Kirouac2010;KEGG-MEDICUS;Guide2Pharma_LRdb;ICELLNET;ProtMapper;S…
#>  6 CXCL9             CXCR3             iTALK;Kirouac2010;Guide2Pharma_LRdb;ICELLNET;SIGNOR;HINT;CellPhoneDB_C…
#>  7 CCL5              CCR5              iTALK;KEGG-MEDICUS;Guide2Pharma_LRdb;ICELLNET;ProtMapper;SIGNOR;HINT;C…
#>  8 CCL8              CCR5              iTALK;Guide2Pharma_LRdb;ICELLNET;HINT;CellPhoneDB_Cellinker;InnateDB;D…
#>  9 CCL4              CCR5              iTALK;Kirouac2010;Guide2Pharma_LRdb;ICELLNET;SIGNOR;HINT;InnateDB;DIP;…
#> 10 IL6               IL6ST             iTALK;SIGNOR;HINT;InnateDB;DIP;UniProt_LRdb;Lit-BM-17;HPMR_talklr;HPMR…

Ligand-Receptor Network Statistics

# Count interactions per ligand
ligand_counts <- lr_interactions %>%
    count(source_genesymbol, name = "n_receptors", sort = TRUE) %>%
    head(15) %>%
    mutate(type = "Ligand")

# Count interactions per receptor  
receptor_counts <- lr_interactions %>%
    count(target_genesymbol, name = "n_ligands", sort = TRUE) %>%
    head(15) %>%
    mutate(type = "Receptor")

# Combine for visualization
combined_counts <- bind_rows(
    ligand_counts %>% rename(gene = source_genesymbol, count = n_receptors),
    receptor_counts %>% rename(gene = target_genesymbol, count = n_ligands)
)

ggplot(combined_counts, aes(x = reorder(gene, count), y = count, fill = type)) +
    geom_col(alpha = 0.8) +
    coord_flip() +
    facet_wrap(~type, scales = "free_y") +
    scale_fill_manual(values = c("Ligand" = "#E74C3C", "Receptor" = "#3498DB")) +
    labs(
        title = "Top Ligands and Receptors",
        subtitle = "Ranked by number of interaction partners",
        x = "Gene",
        y = "Number of Partners"
    ) +
    theme_minimal() +
    theme(
        plot.title = element_text(face = "bold"),
        legend.position = "none",
        strip.text = element_text(face = "bold")
    )
Top ligands and receptors by number of interaction partners in the curated database.

Top ligands and receptors by number of interaction partners in the curated database.

Analysis Workflows

Ligand Classification

# Get all ligands
ligands <- intercell_data %>%
    filter(category == "ligand" | grepl("ligand", category)) %>%
    pull(genesymbol) %>%
    unique()

cat("Total ligands:", length(ligands), "\n")
#> Total ligands: 2932

# Show sample ligands
head(ligands, 20)
#>  [1] "FST"                   "RSPO3"                 "RSPO4"                 "PORCN"                
#>  [5] "GPC4"                  "COMPLEX:THBS1"         "THBS1"                 "RSPO2"                
#>  [9] "RSPO1"                 "SFRP5"                 "DCN"                   "SOST"                 
#> [13] "LEFTY1"                "COMPLEX:SERPINF1"      "COMPLEX:NOTUM"         "IGFBP2"               
#> [17] "COMPLEX:LEFTY1_LEFTY2" "SPARC"                 "NOTUM"                 "COMPLEX:FST_INHBA"

Receptor Classification

# Get receptor annotations
receptors <- intercell_data %>%
    filter(grepl("receptor", category, ignore.case = TRUE))

# Classify receptors by category
receptor_types <- receptors %>%
    count(category, sort = TRUE) %>%
    head(10)

ggplot(receptor_types, aes(x = reorder(category, n), y = n, fill = category)) +
    geom_col(alpha = 0.8) +
    coord_flip() +
    scale_fill_viridis_d(guide = "none") +
    labs(
        title = "Receptor Classification",
        subtitle = "Distribution across receptor subcategories",
        x = "Receptor Category",
        y = "Number of Proteins"
    ) +
    theme_minimal() +
    theme(
        plot.title = element_text(face = "bold"),
        axis.text.y = element_text(size = 9)
    )
Classification of receptors by subcategory showing the diversity of receptor types in the database.

Classification of receptors by subcategory showing the diversity of receptor types in the database.

Resource Comparison

# Analyze resources contributing to L-R interactions
if("sources" %in% colnames(lr_interactions)) {
    resource_counts <- lr_interactions %>%
        separate_rows(sources, sep = ";") %>%
        count(sources, sort = TRUE) %>%
        head(12)
    
    ggplot(resource_counts, aes(x = reorder(sources, n), y = n)) +
        geom_col(fill = "#007B7F", alpha = 0.8) +
        coord_flip() +
        labs(
            title = "Ligand-Receptor Resources",
            subtitle = "Number of interactions per resource",
            x = "Resource",
            y = "Interactions"
        ) +
        theme_minimal() +
        theme(plot.title = element_text(face = "bold"))
}
Comparison of ligand-receptor interaction coverage across different resources integrated in OmniPath.

Comparison of ligand-receptor interaction coverage across different resources integrated in OmniPath.

Session Information

sessionInfo()
#> R version 4.6.0 (2026-04-24)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.4 LTS
#> 
#> Matrix products: default
#> BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8       
#>  [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
#> [10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
#> 
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#>  [1] tidyr_1.3.2      tibble_3.3.1     bookdown_0.46    magrittr_2.0.5   ggraph_2.2.2     igraph_2.3.1    
#>  [7] ggplot2_4.0.3    dplyr_1.2.1      Matrix_1.7-5     OmnipathR_3.19.1 BiocStyle_2.41.0
#> 
#> loaded via a namespace (and not attached):
#>  [1] tidyselect_1.2.1    viridisLite_0.4.3   farver_2.1.2        blob_1.3.0          viridis_0.6.5      
#>  [6] R.utils_2.13.0      S7_0.2.2            fastmap_1.2.0       tweenr_2.0.3        XML_3.99-0.23      
#> [11] digest_0.6.39       timechange_0.4.0    lifecycle_1.0.5     RSQLite_3.52.0      compiler_4.6.0     
#> [16] rlang_1.2.0         sass_0.4.10         progress_1.2.3      tools_4.6.0         utf8_1.2.6         
#> [21] yaml_2.3.12         knitr_1.51          labeling_0.4.3      graphlayouts_1.2.3  prettyunits_1.2.0  
#> [26] bit_4.6.0           curl_7.1.0          xml2_1.5.2          RColorBrewer_1.1-3  R.matlab_3.7.0     
#> [31] withr_3.0.2         purrr_1.2.2         sys_3.4.3           R.oo_1.27.1         polyclip_1.10-7    
#> [36] grid_4.6.0          scales_1.4.0        MASS_7.3-65         cli_3.6.6           rmarkdown_2.31     
#> [41] crayon_1.5.3        generics_0.1.4      otel_0.2.0          httr_1.4.8          tzdb_0.5.0         
#> [46] sessioninfo_1.2.3   readxl_1.5.0        DBI_1.3.0           cachem_1.1.0        ggforce_0.5.0      
#> [51] stringr_1.6.0       rvest_1.0.5         parallel_4.6.0      BiocManager_1.30.27 selectr_0.5-1      
#> [56] cellranger_1.1.0    vctrs_0.7.3         jsonlite_2.0.0      hms_1.1.4           ggrepel_0.9.8      
#> [61] bit64_4.8.2         maketools_1.3.2     jquerylib_0.1.4     glue_1.8.1          lubridate_1.9.5    
#> [66] stringi_1.8.7       gtable_0.3.6        later_1.4.8         logger_0.4.2        pillar_1.11.1      
#> [71] rappdirs_0.3.4      htmltools_0.5.9     R6_2.6.1            httr2_1.2.2         tcltk_4.6.0        
#> [76] tidygraph_1.3.1     vroom_1.7.1         evaluate_1.0.5      lattice_0.22-9      readr_2.2.0        
#> [81] R.methodsS3_1.8.2   backports_1.5.1     memoise_2.0.1       bslib_0.11.0        Rcpp_1.1.1-1.1     
#> [86] zip_2.3.3           gridExtra_2.3       checkmate_2.3.4     xfun_0.57           fs_2.1.0           
#> [91] buildtools_1.0.0    pkgconfig_2.0.3

References

  1. Türei D, et al. Integrated intra- and intercellular signaling knowledge for multicellular omics analysis. Molecular Systems Biology 2021;17:e9923.

  2. Efremova M, et al. CellPhoneDB: inferring cell–cell communication from combined expression of multi-subunit ligand–receptor complexes. Nature Protocols 2020;15:1484-1506.

  3. Ramilowski JA, et al. A draft network of ligand–receptor-mediated multicellular signalling in human. Nature Communications 2015;6:7866.