---
title: "CellChat_comparsion"
output: html_document
date: "2023-10-11"
---
```{r, setup packages}
rm(list = ls())
# CellChat demonstration web page: github:https://github.com/sqjin/CellChat
# CellChat database web: http://www.cellchat.org/
# remotes::install_github("sqjin/CellChat")
library(CellChat)
library(patchwork)
library(Seurat)
library(SeuratData)
library(dplyr)
library(data.table)
library(magrittr)
library(ggplot2)
library(dplyr)
library(plyr)
library(data.table)
library(magrittr)
library(clusterProfiler)
library(Matrix)
library(fossil)
library(liger)
library(ggrepel)
library(scCustomize)
library(ComplexHeatmap)
library(grDevices)
options(stringsAsFactors = FALSE)
# CellChat requires 2 set of input data: 1). scRNA seq expression matrix (e.g. normalized data from Seurat, expression matrix is stored in: seur
```
##Load CellChat object of each dataset
```{r}
cellchat.exp <- readRDS("./data/phenotype/celltype_C/TregTex.cellchat.rds")
cellchat.exp <- updateCellChat(cellchat.exp)
cellchat.ctrl <- readRDS("./data/phenotype/celltype_C/MφOC.cellchat.rds")
cellchat.ctrl <- updateCellChat(cellchat.ctrl)
```
##Lift up CellChat object and merge together
```{r}
# Define the cell labels to lift up
group.new = levels(cellchat.exp@idents)
cellchat.ctrl <- liftCellChat(cellchat.ctrl, group.new)
#> The CellChat object will be lifted up using the cell labels FIB-A, FIB-B, FIB-P, DC, Pericyte, MYL, Immune, ENDO, Muscle, MELA, Basal-P, Basal, Spinious
#> Update slots object@net, object@netP, object@idents in a single dataset...
object.list <- list(MφOC = cellchat.ctrl, TregTex = cellchat.exp)
cellchat <- mergeCellChat(object.list, add.names = names(object.list), cell.prefix = TRUE)
#> Warning in mergeCellChat(object.list, add.names = names(object.list),
#> cell.prefix = TRUE): Prefix cell names!
#> The cell barcodes in merged 'meta' is rep1_AAACCTGCACCAACCG rep1_AAACGGGAGCCGATTT rep1_AAACGGGAGTATCGAA rep1_AAACGGGCATCTCCCA rep1_AAAGATGCACTTGGAT rep1_AAAGATGCAGTTCATG
#> Warning in mergeCellChat(object.list, add.names = names(object.list), cell.prefix = TRUE): The cell barcodes in merged 'meta' is different from those in the used data matrix.
#> We now simply assign the colnames in the data matrix to the rownames of merged 'mata'!
#> Merge the following slots: 'data.signaling','images','net', 'netP','meta', 'idents', 'var.features' , 'DB', and 'LR'.
saveRDS(cellchat, './data/phenotype/celltype_C/TregTex_vs_MφOC.cellchat.rds')
```
##
```{r}
gg1 <- compareInteractions(cellchat, show.legend = F, group = c(1,2))
gg2 <- compareInteractions(cellchat, show.legend = F, group = c(1,2), measure = "weight")
gg1 + gg2
par(mfrow = c(1,2), xpd=TRUE)
netVisual_diffInteraction(cellchat, weight.scale = T)
netVisual_diffInteraction(cellchat, weight.scale = T, measure = "weight")
cairo_pdf(file = './outs/celltype/TregTex_vs_MφOC_cir.pdf', width = 8, height = 8, pointsize = 12)
netVisual_diffInteraction(cellchat, weight.scale = T, measure = "weight")
dev.off()
```
```{r}
gg1 <- netVisual_heatmap(cellchat)
#> Do heatmap based on a merged object
gg2 <- netVisual_heatmap(cellchat, measure = "weight")
#> Do heatmap based on a merged object
gg1 + gg2
cairo_pdf(file = './outs/celltype_E_all/TregTex_vs_MφOC_heat.pdf', width = 12, height = 8, pointsize = 12)
netVisual_heatmap(cellchat, measure = "weight", cluster.rows = T, cluster.cols = T)
dev.off()
```
```{r}
num.link <- sapply(object.list, function(x) {rowSums(x@net$count) + colSums(x@net$count)-diag(x@net$count)})
weight.MinMax <- c(min(num.link), max(num.link)) # control the dot size in the different datasets
gg <- list()
for (i in 1:length(object.list)) {
gg[[i]] <- netAnalysis_signalingRole_scatter(object.list[[i]], title = names(object.list)[i], weight.MinMax = weight.MinMax,font.size = 6#,x.lim = c(0, 40), y.lim = c(0, 40)
)
}
#> Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
#> Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
cairo_pdf(file = './outs/celltype_C/TregTex_vs_MφOC_ins_outs.pdf', width = 10, height = 4, pointsize = 6)
patchwork::wrap_plots(plots = gg)
dev.off()
```
```{r}
cairo_pdf(file = './outs/celltype_C/TregTex_vs_MφOC_conserved_specific.pdf', width = 4, height = 12, pointsize = 10)
rankNet(cellchat, mode = "comparison", stacked = T,measure = c("weight", "count"),
#sources.use = c(17,20), targets.use = c(8,9,10,11),
do.stat = TRUE)
dev.off()
```
#Part III: Identify the upgulated and down-regulated signaling ligand-receptor pairs
```{r}
levels(cellchat@idents[[1]])
# [1] "BMEC" "CD14+ Mo" "CD16+ Mo" "CD4 naive T" "CD4 Tfh" "CD4 Tmem" "CD4 Treg" "CD8 naive T"
# [9] "CD8 Teff" "CD8 Tex" "CD8 Treg" "CD8 Ttrans" "cDC1" "cDC2" "Cycling progenitors" "epithelium"
#[17] "Fibroblast" "immature B" "memory B" "MSC" "Mφ" "naive B" "NK" "OC"
#[25] "OLC" "pDC" "Pericyte" "plasma" "pre/pro B" "promyelocyte" "T cycling"
p1 <- netVisual_bubble(cellchat, sources.use = c(21,4), targets.use = c(1), comparison = c(1, 2), angle.x = 45, thresh = 0.001,min.quantile = 0.5)
p2 <- netVisual_bubble(cellchat, sources.use = 10, targets.use = c(21,24), comparison = c(1, 2), angle.x = 45, thresh = 0.001,min.quantile = 0.5)
p3 <- netVisual_bubble(cellchat, sources.use = 27, targets.use = c(7,24,21,9,10,11,21,24), comparison = c(1, 2), angle.x = 45, thresh = 0.001,min.quantile = 0.5)
p4 <- netVisual_bubble(cellchat, sources.use = 20, targets.use = c(7,24,21,9,10,11,21,24), comparison = c(1, 2), angle.x = 45, thresh = 0.001,min.quantile = 0.5)
p5 <- netVisual_bubble(cellchat, sources.use = 11, targets.use = c(7,24,21,9,10,11,21,24), comparison = c(1, 2), angle.x = 45, thresh = 0.001,min.quantile = 0.5)
p6 <- netVisual_bubble(cellchat, sources.use = 7, targets.use = c(7,24,21,9,10,11,21,24), comparison = c(1, 2), angle.x = 45, thresh = 0.001,min.quantile = 0.5)
p7 <- netVisual_bubble(cellchat, sources.use = 21, targets.use = c(7,24,21,9,10,11,21,24), comparison = c(1, 2), angle.x = 45, thresh = 0.001,min.quantile = 0.5)
p8 <- netVisual_bubble(cellchat, sources.use = 24, targets.use = c(7,24,21,9,10,11,21,24), comparison = c(1, 2), angle.x = 45, thresh = 0.001,min.quantile = 0.5)
p1
cairo_pdf(file = './outs/celltype_E_all/TregTex_vs_MφOC_Treg-Tex->TregTex.pdf', width = 32, height = 24, pointsize = 10)
(p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8) +
plot_layout(ncol =8) # specify 4 columns to arrange all plots in one row
dev.off()
#> Comparing communications on a merged object
```
```{r}
gg1 <- netVisual_bubble(cellchat, sources.use = 29, targets.use = c(1:33), comparison = c(1, 2), max.dataset = 2, title.name = "Higher signaling levels in Treg/Tex", angle.x = 45, remove.isolate = T)
#> Comparing communications on a merged object
gg2 <- netVisual_bubble(cellchat, sources.use = 29, targets.use = c(1:33), comparison = c(1, 2), max.dataset = 1, title.name = "Higher signaling levels in Mφ/OC", angle.x = 45, remove.isolate = T)
#> Comparing communications on a merged object
cairo_pdf(file = './outs/celltype_C/TregTex_vs_MφOC_OC->all_in_de.pdf', width = 24, height = 12, pointsize = 10)
gg1 + gg2
dev.off()
```
```{r}
pathways.show <- c("WNT")
par(mfrow = c(1,2), xpd=TRUE)
ht <- list()
for (i in 1:length(object.list)) {
ht[[i]] <- netVisual_heatmap(object.list[[i]], signaling = pathways.show, color.heatmap = "Reds",title.name = paste(pathways.show, "signaling ",names(object.list)[i]))
}
#> Do heatmap based on a single object
#>
#> Do heatmap based on a single object
#cairo_pdf(file = './outs/celltype_E_all/CXCL.pdf', width = 24, height = 12, pointsize = 10)
ComplexHeatmap::draw(ht[[1]] + ht[[2]], ht_gap = unit(0.5, "cm"))
#dev.off()
```
```{r}
library(ComplexHeatmap)
library(CellChat)
# Assuming CellChatDB$interaction is your dataset
unique_pathways <- unique(CellChatDB$interaction$pathway_name)
# Setting up the plot parameters
par(mfrow = c(1, 2), xpd = TRUE)
# Directory to save the PDF files
output_dir <- './outs/celltype_E_all/per_pathway/'
# Ensure the directory exists
if (!dir.exists(output_dir)) {
dir.create(output_dir, recursive = TRUE)
}
# Loop through each unique pathway
for (pathway in unique_pathways) {
tryCatch({
ht <- list()
for (i in 1:length(object.list)) {
ht[[i]] <- netVisual_heatmap(object.list[[i]], signaling = pathway, color.heatmap = "Reds", title.name = paste(pathway, "signaling", names(object.list)[i]))
}
# Save the plot as a PDF file
pdf_file <- paste0(output_dir, pathway, '.pdf')
cairo_pdf(file = pdf_file, width = 12, height = 6, pointsize = 10)
ComplexHeatmap::draw(ht[[1]] + ht[[2]], ht_gap = unit(0.5, "cm"))
dev.off()
}, error = function(e) {
cat("Error in plotting pathway:", pathway, "\n", e$message, "\nSkipping...\n")
})
}
```
```{r}
# Circle plot
pathways.show <- c("CSF")
weight.max <- getMaxWeight(object.list, slot.name = c("netP"), attribute = pathways.show) # control the edge weights across different datasets
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list)) {
netVisual_aggregate(object.list[[i]], signaling = pathways.show, layout = "circle", edge.weight.max = weight.max[1], edge.width.max = 10, signaling.name = paste(pathways.show, names(object.list)[i]))
}
```
```{r}
cellchat@meta$datasets = factor(cellchat@meta$datasets, levels = c("MφOC", "TregTex")) # set factor level
plotGeneExpression(cellchat, signaling = "CD40", split.by = "datasets", colors.ggplot = T)
#> The legacy packages maptools, rgdal, and rgeos, underpinning the sp package,
#> which was just loaded, were retired in October 2023.
#> Please refer to R-spatial evolution reports for details, especially
#> https://r-spatial.org/r/2023/05/15/evolution4.html.
#> It may be desirable to make the sf package available;
#> package maintainers should consider adding sf to Suggests:.
#> The default behaviour of split.by has changed.
#> Separate violin plots are now plotted side-by-side.
#> To restore the old behaviour of a single split violin,
#> set split.plot = TRUE.
#>
#> This message will be shown once per session.
#> Scale for y is already present.
#> Adding another scale for y, which will replace the existing scale.
#> Scale for y is already present.
#> Adding another scale for y, which will replace the existing scale.
#> Scale for y is already present.
#> Adding another scale for y, which will replace the existing scale.
```
```{r}
#export net probability for integrated plot in python
write.csv(cellchat@net$MφOC$prob, './outs/celltype_C/prob/cellchat@net$MφOC$prob.csv')
write.csv(cellchat@net$TregTex$prob, './outs/celltype_C/prob/cellchat@net$TregTex$prob.csv')
```