Open yueli8 opened 10 months ago
I have somewhat similar issue.
netVisual_embeddingPairwise(cc_obj, type = "functional")
works fine, but there ~700 pathways clustered very tightly so the labels don't show.
I tried to zoom in using netVisual_embeddingZoomIn(cc_obj, type = "functional")
and then I get the same error as @yueli8
Here's a traceback:
Error in base::colSums(x, na.rm = na.rm, dims = dims, ...) :
'x' must be an array of at least two dimensions
6. stop("'x' must be an array of at least two dimensions")
5. base::colSums(x, na.rm = na.rm, dims = dims, ...)
4. colSums(similarity)
3. colSums(similarity)
2. which(colSums(similarity) == 1)
1. netVisual_embeddingZoomIn(cc_obj, type = "functional")
I traced it to those lines: https://github.com/sqjin/CellChat/blob/e4f68625b074247d619c2e488d33970cc531e17c/R/visualization.R#L3474-L3475
and a bit further: https://github.com/sqjin/CellChat/blob/e4f68625b074247d619c2e488d33970cc531e17c/R/visualization.R#L3479-L3482
So it's looking for comparison.name = "single"
, but there is none, so it returns similarity = NULL
.
My merged object consists of 3 datasets and the comparison is called 1-2-3
.
> names(cc_obj@netP[["similarity"]][["functional"]][["matrix"]])
[1] "1-2-3"
@maciejmotyka
Hello maciejmotyka,
Thank you!
#install.packages('devtools')
#devtools::install_github("jinworks/CellChat")
library(CellChat)
library(tidyverse)
library(ggalluvial)
#install.packages("anndata")
library(anndata)
library(anndata)
library(Seurat)
library(patchwork)
library(uwot)
library(reticulate)
library(glmGamPoi)
library(umap)
library(ComplexHeatmap)
#install.packages('NMF')
library(NMF)
library(dplyr)
library(SeuratData)
library(ggplot2)
library(svglite)
library(wordcloud)
library(wordcloud2)
library(tm)
#devtools::install_github("jokergoo/circlize")
library(circlize)
#devtools::install_github("jokergoo/ComplexHeatmap")
#source('functional.R')#千萬不要加上
setwd("~/cellchat")
rm(list=ls()) #清空所有变量
options(stringsAsFactors = FALSE)#输入数据不自动转换成因子(防止数据格式错误)
#(A) Starting from a count data matrix
load("data_humanSkin_CellChat.rda")
data.input = data_humanSkin$data
meta = data_humanSkin$meta
cell.use = rownames(meta)[meta$condition == "LS"] # extract the c
data.input = data.input[, cell.use]
meta = meta[cell.use, ]
#(B) Starting from a Seurat object
#data.input <- GetAssayData(seurat_object, assay = "RNA", slot = "data") # normalized data matrix
#labels <- Idents(seurat_object)
#meta <- data.frame(group = labels, row.names = names(labels)) # create a dataframe of the cell labels
#(C) Starting from a SingleCellExperiment object
#data.input <- SingleCellExperiment::logcounts(object) # normalized data matrix
#meta <- as.data.frame(SingleCellExperiment::colData(object)) # extract a dataframe of the cell labels
#meta$labels <- meta[["sce.clusters"]]
#(D) Starting from an Anndata object
# read the data into R using anndata R package
#ad <- read_h5ad("scanpy_object.h5ad")# access count data matrix
#counts <- t(as.matrix(ad$X)) # normalize the count data if the normalized data is not available in the .h5ad file
#library.size <- Matrix::colSums(counts)
#data.input <- as(log1p(Matrix::t(Matrix::t(counts)/library.size)* 10000), "dgCMatrix")
#meta <- ad$obs# access meta data
#meta$labels <- meta[["clusters"]]
#2.Create a CellChat object by following option
#(A) Starting from the digital gene expression matrix and cell label information
cellchat <- createCellChat(object = data.input, meta = meta, group.by = "labels")
# [1] "Create a CellChat object from a data matrix"
# Set cell identities for the new CellChat object
# The cell groups used for CellChat analysis are APOE+ FIB FBN1+ FIB COL11A1+ FIB Inflam. FIB cDC1 cDC2 LC Inflam. DC TC Inflam. TC CD40LG+ TC NKT
#(B) Starting from a Seurat object
#cellChat <- createCellChat(object = seurat.obj, group.by = "ident", assay = "RNA")
#(C) Starting from a SingleCellExperiment object
#cellChat <- createCellChat(object = sce.obj, group.by = "sce.clusters")
#(D) Starting from an AnnData object
#sce <- zellkonverter::readH5AD(file = "adata.h5ad") # retrieve all the available assays within sce object assayNames(sce)
# add a new assay entry "logcounts" if not available
#counts <- assay(sce, "X") # make sure this is the original count data matrix
#library.size <- Matrix::colSums(counts)
#logcounts(sce) <- log1p(Matrix::t(Matrix::t(counts)/library.size) * 10000)
# extract a cell meta data
#meta <- as.data.frame(SingleCellExperiment::colData(sce)) #
#cellChat <- createCellChat(object = sce, group.by = "sce.clusters")
CellChatDB <- CellChatDB.human
showDatabaseCategory(CellChatDB)
# Show the structure of the database
dplyr::glimpse(CellChatDB$interaction)
# use a subset of CellChatDB for cell-cell communication analysis
CellChatDB.use <- subsetDB(CellChatDB, search = "Secreted Signaling")# use Secreted Signaling
CellChatDB.use <- CellChatDB # simply use the default CellChatDB to use all CellChatDB for cell-cell communication analysis
# set the used database in the object
cellchat@DB <- CellChatDB.use
cellchat <- subsetData(cellchat) # This step is necessary even if using the whole database
future::plan("multisession", workers = 4) # do parallel
cellchat <- identifyOverExpressedGenes(cellchat)
cellchat <- identifyOverExpressedInteractions(cellchat)
#Inference of cell-cell communication network
cellchat <- computeCommunProb(cellchat, type = "triMean")
#triMean is used for calculating the average gene expression per cell group.
#[1] ">>> Run CellChat on sc/snRNA-seq data <<< [2023-12-15 12:49:11.48819]"
#|=============================================================================================================| 100%
#[1] ">>> CellChat inference is done. Parameter values are stored in `object@options$parameter` <<< [2023-12-15 12:51:34.162272]"
cellchat <- filterCommunication(cellchat, min.cells = 10)
cellchat <- computeCommunProbPathway(cellchat)
cellchat <- aggregateNet(cellchat)
saveRDS(cellchat, file = "cellchat_humanSkin_LS.rds")
#Visualization of cell-cell communication network
#(A) Circle plot ## Access all the signaling pathways showing significant communications
pathways.show.all <- cellchat@netP$pathways
# select one pathway
pathways.show <- c("CXCL")
par(mfrow=c(1,1))
netVisual_aggregate(cellchat, signaling = pathways.show, layout = "circle", color.use = NULL, sources.use = NULL, targets.use = NULL, idents.use = NULL)
#(B) Hierarchy plot
vertex.receiver = seq(1,4)
netVisual_aggregate(cellchat, signaling = pathways.show, layout ="hierarchy", vertex.receiver = vertex.receiver)
#(C) Chord diagram
par(mfrow=c(1,1))
netVisual_aggregate(cellchat, signaling = pathways.show, layout ="chord")
par(mfrow=c(1,1))
group.cellType <- c(rep("FIB", 4), rep("DC", 4), rep("TC", 4)) #grouping cell clusters into fibroblast, DC and TC cells
names(group.cellType) <- levels(cellchat@idents)
netVisual_chord_cell(cellchat, signaling = pathways.show, group =group.cellType, title.name = paste0(pathways.show, " signaling network"))
#(D) Heatmap plot
par(mfrow=c(1,1))
netVisual_heatmap(cellchat, signaling = pathways.show, color.heatmap = "Reds")
netAnalysis_contribution(cellchat, signaling = pathways.show)
pairLR.CXCL <- extractEnrichedLR(cellchat, signaling = pathways.show, geneLR.return = FALSE)
LR.show <- pairLR.CXCL[1,]
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, layout = "circle")
#(A) Bubble plot
# (1) show all the significant interactions (L-R pairs) from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), remove.isolate = FALSE)
# (2) show all the significant interactions (L-R pairs) associated with certain signaling pathways
netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), signaling = c("CCL","CXCL"), remove.isolate = FALSE)
## (3) show all the significant interactions (L-R pairs) based on user's input (defined by `pairLR.use`)
pairLR.use <- extractEnrichedLR(cellchat, signaling = c("CCL","CXCL","FGF"))
netVisual_bubble(cellchat, sources.use = c(3,4), targets.use = c(5:8), pairLR.use = pairLR.use, remove.isolate = TRUE)
# set the order of interacting cell pairs on x-axis
# (4) Default: first sort cell pairs based on the appearance of sources in levels(object@idents), and then based on the appearance of targets in levels(object@idents)
# (5) sort cell pairs based on the targets.use defined by users
netVisual_bubble(cellchat, targets.use = c("LC","Inflam. DC","cDC2","CD40LG+ TC"), pairLR.use = pairLR.use,
remove.isolate = TRUE, sort.by.target = T)
# (6) sort cell pairs based on the sources.use defined by users
netVisual_bubble(cellchat, sources.use = c("FBN1+ FIB","APOE+ FIB","Inflam. FIB"),
pairLR.use = pairLR.use, remove.isolate = TRUE,sort.by.source = T)
# (7) sort cell pairs based on the sources.use and then targets.use defined by users
netVisual_bubble(cellchat, sources.use = c("FBN1+ FIB","APOE+ FIB","Inflam. FIB"), targets.use = c("LC","Inflam. DC","cDC2","CD40LG+ TC"), pairLR.use = pairLR.use, remove.isolate = TRUE,
sort.by.source = T, sort.by.target = T)
# (8) sort cell pairs based on the targets.use and then sources.use defined by users
netVisual_bubble(cellchat, sources.use = c("FBN1+ FIB","APOE+ FIB","Inflam. FIB"), targets.use = c("LC","Inflam. DC","cDC2","CD40LG+ TC"),
pairLR.use = pairLR.use, remove.isolate = TRUE, sort.by.source = T, sort.by.target = T, sort.by.source.priority = FALSE)
#(B) Chord diagram
# show all the significant interactions (L-R pairs) from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
# show all the interactions sending from Inflam.FIB
netVisual_chord_gene(cellchat, sources.use = 4, targets.use = c(5:11), lab.cex = 0.5,legend.pos.y = 30)
# show all the interactions received by Inflam.DC
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = 8, legend.pos.x = 15)
# show all the significant interactions (L-R pairs) associated with certain signaling pathways
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = c(5:11), signaling = c("CCL","CXCL"),legend.pos.x = 8)
# show all the significant signaling pathways from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = c(5:11), slot.name = "netP", legend.pos.x = 10)
plotGeneExpression(cellchat, signaling = "CXCL", enriched.only =TRUE)
#(A)Compute and visualize the network centrality scores
cellchat <- netAnalysis_computeCentrality(cellchat, slot.name = "netP")# the slot 'netP' means the inferred intercellular communication network of signaling pathways
# Visualize the computed centrality scores using heatmap, allowing ready identification of major signaling roles of cell groupsnetAnalysis_signalingRole_network(cellchat, signaling = pathways.show, width = 8, height = 2.5, font.size = 10)
netAnalysis_signalingRole_network(cellchat, signaling = pathways.show, width = 8, height = 2.5, font.size = 10)
#(B) Visualize dominant senders (sources) and receivers (targets) in a 2D space
netAnalysis_signalingRole_scatter(cellchat, signaling = NULL)
#(C) Identify signals contributing the most to outgoing or incoming signaling of certain cell groups
ht1 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "outgoing")
ht2 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "incoming")
ht1 + ht2
#(A) Identify and visualize outgoing communication pattern of secreting cells
# infer the number of patterns.
selectK(cellchat, pattern ="outgoing")
# Both Cophenetic and Silhouette values begin to drop suddenly when the number of outgoing patterns is 3.
nPatterns = 3
cellchat <- identifyCommunicationPatterns(cellchat, pattern ="outgoing", k = nPatterns)
netAnalysis_river(cellchat, pattern ="outgoing")# river plot
netAnalysis_dot(cellchat, pattern ="outgoing")# dot plot
#(B) Identify and visualize incoming communication pattern of target cells
selectK(cellchat, pattern = "incoming")
nPatterns = 4
cellchat <- identifyCommunicationPatterns(cellchat, pattern = "incoming", k = nPatterns)
netAnalysis_river(cellchat, pattern = "incoming")# river plot
netAnalysis_dot(cellchat, pattern = "incoming")# dot plot
#(A) Functional similarity
cellchat <- computeNetSimilarity(cellchat, type = "functional")
cellchat <- netEmbedding(cellchat, type = "functional")#install through "pip install umap-learn"
#或者下面三條命令都可以運行
#cellchat <- netEmbedding(cellchat, umap.method='uwot',type ="functional")
#cellchat <- netEmbedding(cellchat, umap.method='umap-learn',type ="functional")
cellchat <- netClustering(cellchat, type = "functional",do.parallel=FALSE)#加上"do.parallel=FALSE"
netVisual_embedding(cellchat, type = "functional", label.size =3.5)
netVisual_embeddingZoomIn(cellchat, type = "functional", nCol = 2)
Hello Maciej Motyka,
It work fine with me on demo data.
I already posted on github.
Hope that can help me.
Thank you!
Best,
Yue
At 2024-01-20 05:10:43, "Maciej Motyka" @.***> wrote:
I have somewhat similar issue. netVisual_embeddingPairwise(cc_obj, type = "functional") works fine, but there ~700 pathways clustered very tightly so the labels don't show. I tried to zoom in using netVisual_embeddingZoomIn(cc_obj, type = "functional") and then I get the same error as @yueli8
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>
@maciejmotyka
Try:
netVisual_embeddingPairwiseZoomIn
Try:
netVisual_embeddingPairwiseZoomIn(cellchat, type = "functional", nCol = 2)
At 2024-01-20 05:10:43, "Maciej Motyka" @.***> wrote:
I have somewhat similar issue. netVisual_embeddingPairwise(cc_obj, type = "functional") works fine, but there ~700 pathways clustered very tightly so the labels don't show. I tried to zoom in using netVisual_embeddingZoomIn(cc_obj, type = "functional") and then I get the same error as @yueli8
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>
Hello,
Thank you for developing so nice software!
Thank you in advance for great help!
Best,
Yue