CellChat 三部曲2:使用CellChat 對多個數據集細胞通訊進行比較分析
- 加載所需的包
- 創建目錄以保存圖片
- 加載每個數據集的CellChat對象,然后合并在一起
- 第一部分:預測細胞通信的一般原理
- 比較交互總數和交互強度
- 比較不同細胞群之間的相互作用數量和相互作用強度
- 比較 2D 空間中的主要來源和目標
- 第二部分:識別保守和環境特異的信號通路
- 根據信號/結構的相似性識別差異較大(或更少)的信號網絡以及信號組
- 識別并可視化保守和環境特異的信號通路
- 第三部分:識別上調和下調的信號配體對
- 第四部分:使用層次結構圖、圓圖或和弦圖可視比較細胞-細胞通信
- 第五部分:比較不同數據集之間的信號基因表達分布
- 保存合并的CellChat對象
此教程展示了如何應用 CellChat 來識別主要的信號變化,以及通過多個細胞通信網絡的聯合多重學習和定量對比保守和環境特異的信號。我們通過將其應用于來自兩種生物條件:(NL,正常) 和(LS, 損傷) 人類皮膚的細胞的 scRNA-seq 數據,來展示 CellChat 的多重分析功能。這兩個數據集具有相同的細胞群組成。如果不同數據集之間的細胞群組成略有或差異較大,請查看另一個相關的教程。
CellChat 采用自上而下的方法,即從大局出發,然后對信號機制進行更詳細的改進,以識別不同級別的信號變化,包括細胞通信的一般原則和功能失調的細胞群/信號通路/受配體。
加載所需的包
library(CellChat)
library(patchwork)
創建目錄以保存圖片
data.dir <- './comparison'
dir.create(data.dir)
setwd(data.dir)
加載每個數據集的cellchat對象,然后合并在一起
用戶需要在每個數據集上單獨運行 CellChat,然后將不同的 CellChat 對象合并在一起。如果您有使用較早版本(< 0.5.0)獲得的 CellChat 對象,請首先updateCellChat
cellchat.NL <- readRDS(url("https://ndownloader.figshare.com/files/25954199"))
cellchat.LS <- readRDS(url("https://ndownloader.figshare.com/files/25956518"))
object.list <- list(NL = cellchat.NL, LS = cellchat.LS)
cellchat <- mergeCellChat(object.list, add.names = names(object.list))
#> Merge the following slots: 'data.signaling','net', 'netP','meta', 'idents', 'var.features' , 'DB', and 'LR'.
cellchat
#> An object of class CellChat created from a merged object with multiple datasets
#> 555 signaling genes.
#> 7563 cells.
第一部分:預測細胞通信的一般原理
cellchat從大局出發,預測細胞通信的一般原理。在比較多種生物條件下的細胞-細胞通信時,可以回答以下生物學問題:
- 細胞-細胞通信是否增強
- 細胞類型顯著變化之間的相互作用
- 主要來源和目標如何從一個條件到為另一個條件變化的
比較交互總數和交互強度
為了回答細胞-細胞通信是否增強的問題,CellChat比較了來自不同生物條件的細胞通信網絡的相互作用數量和強度。
gg1 <- compareInteractions(cellchat, show.legend = F, group = c(1,2))
gg2 <- compareInteractions(cellchat, show.legend = F, group = c(1,2), measure = "weight")
gg1 + gg2
比較不同細胞群之間的相互作用數量和強度
為了確定細胞群之間顯示顯著變化的相互作用,CellChat 比較了不同細胞群之間的相互作用數量和強度。
不同細胞群之間的相互作用數量或強度的差異
兩個數據集之間細胞通信網絡中交互或交互強度的差異數可以使用圓圖可視化, 與第一個數據集相比,[紅色](或[藍色]邊表示信號在第二個數據集中增加或[減少])。
par(mfrow = c(1,2), xpd=TRUE)
netVisual_diffInteraction(cellchat, weight.scale = T)
netVisual_diffInteraction(cellchat, weight.scale = T, measure = "weight")
我們還可以使用熱圖在更大的細節中顯示交互的差異數或交互強度。頂部彩色條形圖表示熱圖(傳入信號)中顯示的列值的總和。右邊的彩色條形圖表示一行值(傳出信號)的總和。在色條中紅色或藍色表示第二個數據集中與第一個數據集相比增加或[減少]信號。
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
差異網絡分析僅適用于配對數據集。如果有更多的數據集進行比較,我們可以直接顯示每個數據集中任意兩個細胞群之間的交互次數或交互強度。
為了更好地控制不同數據集中推斷網絡的節點大小和邊緣權重,我們計算每個細胞組的最大細胞數量以及所有數據集中交互(或交互權重)的最大數量。
weight.max <- getMaxWeight(object.list, attribute = c("idents","count"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list)) {
netVisual_circle(object.list[[i]]@net$count, weight.scale = T, label.edge= F, edge.weight.max = weight.max[2], edge.width.max = 12, title.name = paste0("Number of interactions - ", names(object.list)[i]))
}
不同細胞類型之間相互作用或交互強度的差異
為了簡化復雜的網絡,并深入了解細胞類型級別的細胞通信,我們可以根據定義的細胞群聚合細胞-細胞通信。在這里,我們將細胞群分為三種細胞類型,然后重新合并CellChat對象列表。
group.cellType <- c(rep("FIB", 4), rep("DC", 4), rep("TC", 4))
group.cellType <- factor(group.cellType, levels = c("FIB", "DC", "TC"))
object.list <- lapply(object.list, function(x) {mergeInteractions(x, group.cellType)})
cellchat <- mergeCellChat(object.list, add.names = names(object.list))
#> Merge the following slots: 'data.signaling','net', 'netP','meta', 'idents', 'var.features' , 'DB', and 'LR'.
然后,我們可以顯示每個數據集中任意兩個細胞類型之間的交互次數或交互強度。
weight.max <- getMaxWeight(object.list, slot.name = c("idents", "net", "net"), attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list)) {
netVisual_circle(object.list[[i]]@net$count.merged, weight.scale = T, label.edge= T, edge.weight.max = weight.max[3], edge.width.max = 12, title.name = paste0("Number of interactions - ", names(object.list)[i]))
}
此外,我們還可以使用圓圖顯示任意兩種細胞類型之間的交互或交互強度的差異。與第一個數據集相比,紅色(或藍色)色邊緣表示第二個數據集中的信號增加(或減少)。
par(mfrow = c(1,2), xpd=TRUE)
netVisual_diffInteraction(cellchat, weight.scale = T, measure = "count.merged", label.edge = T)
netVisual_diffInteraction(cellchat, weight.scale = T, measure = "weight.merged", label.edge = T)
比較 2D 空間中的主要來源和目標
比較二D空間中的傳出和傳入交互強度,可以識別不同數據集之間顯著變化的發送或接收信號的細胞群。
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)
}
#> 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
patchwork::wrap_plots(plots = gg)
從散點圖中,我們可以看到與 NL 相比,Inflam.DC 和 cDC1 成為 LS 中的主要來源和目標之一。纖維細胞群也成為LS的主要來源。
第二部分:識別保守和環境特異的信號通路
然后,CellChat 可以根據其在多種生物條件下的細胞通信網絡,識別差異較大(或更少)的信號網絡、信號組以及基于其細胞通信網絡的保守和環境特異的信號通路。
根據信號/結構的相似性識別差異較大(或更少)的信號網絡以及信號組
CellChat 根據推斷的通信網絡的功能和拓撲相似性,對其進行聯合多重學習和分類。NB:此類分析適用于兩個以上的數據集。
功能相似性:功能相似度高表示主要發射器和接收器相似,可解釋為兩個信號通路或兩個配體受體對具有相似的作用。NB:功能相似性分析不適用于具有不同細胞類型成分的多個數據集。
結構相似性:結構相似性用于比較其信號網絡結構,而不考慮發送器和接收器的相似性。NB:結構相似性分析適用于具有相同細胞類型組成或截然不同的細胞類型組成多個數據集。
在這里,我們可以根據功能相似性運行多重和分類學習分析,因為兩個數據集具有相同的單元類型組成。
根據信號組的功能相似性識別信號組
cellchat <- computeNetSimilarityPairwise(cellchat, type = "functional")
#> Compute signaling network similarity for datasets 1 2
cellchat <- netEmbedding(cellchat, type = "functional")
#> Manifold learning of the signaling networks for datasets 1 2
cellchat <- netClustering(cellchat, type = "functional")
#> Classification learning of the signaling networks for datasets 1 2
# Visualization in 2D-space
netVisual_embeddingPairwise(cellchat, type = "functional", label.size = 3.5)
#> 2D visualization of signaling networks from datasets 1 2
# netVisual_embeddingZoomIn(cellchat, type = "functional", nCol = 2)
基于結構相似性識別信號組
cellchat <- computeNetSimilarityPairwise(cellchat, type = "structural")
#> Compute signaling network similarity for datasets 1 2
cellchat <- netEmbedding(cellchat, type = "structural")
#> Manifold learning of the signaling networks for datasets 1 2
cellchat <- netClustering(cellchat, type = "structural")
#> Classification learning of the signaling networks for datasets 1 2
# Visualization in 2D-space
netVisual_embeddingPairwise(cellchat, type = "structural", label.size = 3.5)
#> 2D visualization of signaling networks from datasets 1 2
netVisual_embeddingPairwiseZoomIn(cellchat, type = "structural", nCol = 2)
#> 2D visualization of signaling networks from datasets 1 2
計算和可視化通路距離
我們可以根據信號網絡在共享雙維空間中的歐幾里德距離來識別差異較大(或更少)的信號網絡。更大的距離意味著兩個數據集之間的通信網絡在功能或結構相似性方面存在更大的差異。NB:我們只計算兩個數據集之間重疊信號通路的距離。此處未考慮僅在一個數據集中標識的信號通路。如果有三個以上的數據集,可以通過在函數rankSimilarity中定義comparison進行對比。
rankSimilarity(cellchat, type = "functional")
#> Compute the distance of signaling networks between datasets 1 2
識別并可視化保守和環境特異的信號通路
通過比較每個信號通路的信息流/交互,我們可以識別信號通路,(i) 關閉,(ii) 減少,(iii) 打開或(iv) 增加。
比較每個信號通路的整體信息流
我們可以通過簡單地比較每個信號通路的信息流來識別保守和環境特異的信號通路,該信息流由推斷網絡中所有一對細胞群之間的通信概率之和(即網絡中的總權重)定義。
此條形圖可在堆疊模式下繪制。根據 NL 和 LS 皮膚之間推斷的網絡中整體信息流的差異對重要信號通路進行排名。紅色的頂部信號通路富含 NL 皮膚,綠色在 LS 皮膚中得到了富集。
gg1 <- rankNet(cellchat, mode = "comparison", stacked = T, do.stat = TRUE)
gg2 <- rankNet(cellchat, mode = "comparison", stacked = F, do.stat = TRUE)
gg1 + gg2
比較與每個細胞群相關的傳出(或傳入)信號
上述分析將傳出和傳入信號的信息匯總在一起。我們還可以比較兩個數據集之間的傳出(或傳入)信號模式,從而識別顯示不同信號模式的信號通路/受配體。
我們可以將來自不同數據集的所有已識別的信號通路進行組合,從而并排比較它們,包括傳出信號、傳入信號和整體信號,方法是將傳出和傳入信號聚合在一起。NB:rankNet還顯示了整體信號的比較,但它沒有顯示特定細胞群中的信號強度。
library(ComplexHeatmap)
#> Loading required package: grid
#> ========================================
#> ComplexHeatmap version 2.7.1.1010
#> Bioconductor page: http://bioconductor.org/packages/ComplexHeatmap/
#> Github page: https://github.com/jokergoo/ComplexHeatmap
#> Documentation: http://jokergoo.github.io/ComplexHeatmap-reference
#>
#> If you use it in published research, please cite:
#> Gu, Z. Complex heatmaps reveal patterns and correlations in multidimensional
#> genomic data. Bioinformatics 2016.
#>
#> This message can be suppressed by:
#> suppressPackageStartupMessages(library(ComplexHeatmap))
#> ========================================
i = 1
# combining all the identified signaling pathways from different datasets
pathway.union <- union(object.list[[i]]@netP$pathways, object.list[[i+1]]@netP$pathways)
ht1 = netAnalysis_signalingRole_heatmap(object.list[[i]], pattern = "outgoing", signaling = pathway.union, title = names(object.list)[i], width = 5, height = 6)
ht2 = netAnalysis_signalingRole_heatmap(object.list[[i+1]], pattern = "outgoing", signaling = pathway.union, title = names(object.list)[i+1], width = 5, height = 6)
draw(ht1 + ht2, ht_gap = unit(0.5, "cm"))
ht1 = netAnalysis_signalingRole_heatmap(object.list[[i]], pattern = "incoming", signaling = pathway.union, title = names(object.list)[i], width = 5, height = 6, color.heatmap = "GnBu")
ht2 = netAnalysis_signalingRole_heatmap(object.list[[i+1]], pattern = "incoming", signaling = pathway.union, title = names(object.list)[i+1], width = 5, height = 6, color.heatmap = "GnBu")
draw(ht1 + ht2, ht_gap = unit(0.5, "cm"))
ht1 = netAnalysis_signalingRole_heatmap(object.list[[i]], pattern = "all", signaling = pathway.union, title = names(object.list)[i], width = 5, height = 6, color.heatmap = "OrRd")
ht2 = netAnalysis_signalingRole_heatmap(object.list[[i+1]], pattern = "all", signaling = pathway.union, title = names(object.list)[i+1], width = 5, height = 6, color.heatmap = "OrRd")
draw(ht1 + ht2, ht_gap = unit(0.5, "cm"))
第三部分:識別上調和下調的信號配體對
我們可以比較由某些細胞群到其他細胞組的配體受體對調節的通信概率。這可以通過設置comparison在函數netVisual_bubble中來完成。
netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), comparison = c(1, 2), angle.x = 45)
#> Comparing communications on a merged object
此外,我們可以在一個數據集中識別與另一個數據集相比,上升(增加)和下降調節(減少)信號配體受體對。這可以通過指定max.dataset和min.dataset在函數netVisual_bubble中完成。信號增加意味著這些信號在一個數據集中與其他數據集相比具有更高的通信概率(強度)。
gg1 <- netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), comparison = c(1, 2), max.dataset = 2, title.name = "Increased signaling in LS", angle.x = 45, remove.isolate = T)
#> Comparing communications on a merged object
gg2 <- netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), comparison = c(1, 2), max.dataset = 1, title.name = "Decreased signaling in LS", angle.x = 45, remove.isolate = T)
#> Comparing communications on a merged object
gg1 + gg2
NB:氣泡圖中顯示的配體受體對可以通過signaling.LSIncreased = gg1$data 訪問。
通過比較每個 L-R 對和每對細胞組的兩個數據集之間的通信概率,可以采用上述方法來識別上調和下調的信號。另外,我們可以根據微分基因表達分析來識別上調和下調的信號配體對。具體來說,我們對每個細胞組執行兩種生物條件(即NL和LS)之間的微分表達分析,然后根據發送者細胞中配體和接收器細胞中受體的折疊變化獲得上調和下調的信號。此類分析可如下所示。
# define a positive dataset, i.e., the dataset with positive fold change against the other dataset
pos.dataset = "LS"
# define a char name used for storing the results of differential expression analysis
features.name = pos.dataset
# perform differential expression analysis
cellchat <- identifyOverExpressedGenes(cellchat, group.dataset = "datasets", pos.dataset = pos.dataset, features.name = features.name, only.pos = FALSE, thresh.pc = 0.1, thresh.fc = 0.1, thresh.p = 1)
#> Use the joint cell labels from the merged CellChat object
# map the results of differential expression analysis onto the inferred cell-cell communications to easily manage/subset the ligand-receptor pairs of interest
net <- netMappingDEG(cellchat, features.name = features.name)
# extract the ligand-receptor pairs with upregulated ligands in LS
net.up <- subsetCommunication(cellchat, net = net, datasets = "LS",ligand.logFC = 0.2, receptor.logFC = NULL)
# extract the ligand-receptor pairs with upregulated ligands and upregulated recetptors in NL, i.e.,downregulated in LS
net.down <- subsetCommunication(cellchat, net = net, datasets = "NL",ligand.logFC = -0.1, receptor.logFC = -0.1)
由于信號基因在多亞單位中可能很復雜,我們可以使用net.upnet.down進一步的來獲得單個信號基因。
gene.up <- extractGeneSubsetFromPair(net.up, cellchat)
gene.down <- extractGeneSubsetFromPair(net.down, cellchat)
然后,我們使用氣泡圖或和弦圖可視化上調和向下調的信號配體對。
pairLR.use.up = net.up[, "interaction_name", drop = F]
gg1 <- netVisual_bubble(cellchat, pairLR.use = pairLR.use.up, sources.use = 4, targets.use = c(5:11), comparison = c(1, 2), angle.x = 90, remove.isolate = T,title.name = paste0("Up-regulated signaling in ", names(object.list)[2]))
#> Comparing communications on a merged object
pairLR.use.down = net.down[, "interaction_name", drop = F]
gg2 <- netVisual_bubble(cellchat, pairLR.use = pairLR.use.down, sources.use = 4, targets.use = c(5:11), comparison = c(1, 2), angle.x = 90, remove.isolate = T,title.name = paste0("Down-regulated signaling in ", names(object.list)[2]))
#> Comparing communications on a merged object
gg1 + gg2
使用和弦圖可視化上調和下調的信號配體對
# Chord diagram
par(mfrow = c(1,2), xpd=TRUE)
netVisual_chord_gene(object.list[[2]], sources.use = 4, targets.use = c(5:11), slot.name = 'net', net = net.up, lab.cex = 0.8, small.gap = 3.5, title.name = paste0("Up-regulated signaling in ", names(object.list)[2]))
#> Note: The first link end is drawn out of sector 'MIF'.
netVisual_chord_gene(object.list[[1]], sources.use = 4, targets.use = c(5:11), slot.name = 'net', net = net.down, lab.cex = 0.8, small.gap = 3.5, title.name = paste0("Down-regulated signaling in ", names(object.list)[2]))
第四部分:使用層次結構圖、圓圖或和弦圖可視比較細胞-細胞通信
與單個數據集的 CellChat 分析類似,我們可以使用層次結構圖、圓圖或和弦圖可視化細胞通信網絡。
邊緣顏色/重量、節點顏色/大小/形狀:在所有可視化圖中,邊緣顏色與發送者源一致,邊緣權重與交互強度成正比。較厚的邊緣線表示信號更強。在層次結構圖和圓圖中,圓的大小與每個細胞組中的細胞數量成正比。在層次圖中,實心和開放的圓分別代表源和目標。在和弦圖中,內條顏色表示從相應的外條接收信號的目標。內條大小與目標接收的信號強度成正比。這種內條有助于解釋復雜的和弦圖。請注意,有一些內條沒有任何和弦的一些細胞組,請忽略他們,因為這是一個本包尚未解決的問題。
pathways.show <- c("CXCL")
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]))
}
pathways.show <- c("CXCL")
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
ComplexHeatmap::draw(ht[[1]] + ht[[2]], ht_gap = unit(0.5, "cm"))
# Chord diagram
pathways.show <- c("CXCL")
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list)) {
netVisual_aggregate(object.list[[i]], signaling = pathways.show, layout = "chord", signaling.name = paste(pathways.show, names(object.list)[i]))
}
#> Note: The first link end is drawn out of sector 'Inflam. FIB'.
netVisual_chord_cell對于和弦圖,CellChat 具有獨立函數,通過調整circlize包中的不同參數來靈活可視化信號網絡。例如,我們可以定義一個group命名的字符矢量,以創建多組和弦圖,將細胞群集分組到不同的細胞類型。
# Chord diagram
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(object.list[[1]]@idents)
pathways.show <- c("CXCL")
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list)) {
netVisual_chord_cell(object.list[[i]], signaling = pathways.show, group = group.cellType, title.name = paste0(pathways.show, " signaling network - ", names(object.list)[i]))
}
#> Plot the aggregated cell-cell communication network at the signaling pathway level
#> Plot the aggregated cell-cell communication network at the signaling pathway level
#> Note: The first link end is drawn out of sector 'Inflam. FIB'.
使用和弦圖,CellChat 提供兩個函數netVisual_chord_cell和netVisual_chord_gene,
可視化具有不同目的和不同級別的細胞-細胞通信。 netVisual_chord_cell用于可視化不同細胞群之間的細胞-細胞通信(和弦圖中的每個部分是細胞組),netVisual_chord_gene用于可視化由多個配體受體或信號通路調解的細胞-細胞通信(和弦圖中的每個部分都是配體、受體或信號通路)。
par(mfrow = c(1, 2), xpd=TRUE)
# compare all the interactions sending from Inflam.FIB to DC cells
for (i in 1:length(object.list)) {
netVisual_chord_gene(object.list[[i]], sources.use = 4, targets.use = c(5:8), lab.cex = 0.5, title.name = paste0("Signaling from Inflam.FIB - ", names(object.list)[i]))
}
# compare all the interactions sending from fibroblast to inflamatory immune cells
par(mfrow = c(1, 2), xpd=TRUE)
for (i in 1:length(object.list)) {
netVisual_chord_gene(object.list[[i]], sources.use = c(1,2, 3, 4), targets.use = c(8,10), title.name = paste0("Signaling received by Inflam.DC and .TC - ", names(object.list)[i]), legend.pos.x = 10)
}
# show all the significant signaling pathways from fibroblast to immune cells
par(mfrow = c(1, 2), xpd=TRUE)
for (i in 1:length(object.list)) {
netVisual_chord_gene(object.list[[i]], sources.use = c(1,2,3,4), targets.use = c(5:11),slot.name = "netP", title.name = paste0("Signaling pathways sending from fibroblast - ", names(object.list)[i]), legend.pos.x = 10)
}
#> Note: The second link end is drawn out of sector ' '.
#> Note: The first link end is drawn out of sector 'MIF'.
#> Note: The second link end is drawn out of sector ' '.
#> Note: The first link end is drawn out of sector 'CXCL '.
NB:在生成繪圖時,請忽略注釋,例如"Note: The first link end is drawn out of sector ‘MIF’"。如果基因名稱重疊,您可以通過降低small.gap值來調整參數。
第五部分:比較不同數據集之間的信號基因表達分布
我們可以利用seurat包裝的函數plotGeneExpression繪制與L-R對或信號通路相關的信號基因的基因表達分布圖。
cellchat@meta$datasets = factor(cellchat@meta$datasets, levels = c("NL", "LS")) # set factor level
plotGeneExpression(cellchat, signaling = "CXCL", split.by = "datasets", colors.ggplot = T)
#> 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.
保存合并的cellchat對象
saveRDS(cellchat, file = "cellchat_comparisonAnalysis_humanSkin_NL_vs_LS.rds")