CellChat 三部曲2:使用CellChat 對多個數據集細胞通訊進行比較分析

CellChat 三部曲2:使用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
1624065296202

比較不同細胞群之間的相互作用數量和強度

為了確定細胞群之間顯示顯著變化的相互作用,CellChat 比較了不同細胞群之間的相互作用數量和強度。

不同細胞群之間的相互作用數量或強度的差異

兩個數據集之間細胞通信網絡中交互或交互強度的差異數可以使用圓圖可視化, 與第一個數據集相比,[紅色](或[藍色]邊表示信號在第二個數據集中增加或[減少])。

par(mfrow = c(1,2), xpd=TRUE)
netVisual_diffInteraction(cellchat, weight.scale = T)
netVisual_diffInteraction(cellchat, weight.scale = T, measure = "weight")
1624065351249

我們還可以使用熱圖在更大的細節中顯示交互的差異數或交互強度。頂部彩色條形圖表示熱圖(傳入信號)中顯示的列值的總和。右邊的彩色條形圖表示一行值(傳出信號)的總和。在色條中紅色或藍色表示第二個數據集中與第一個數據集相比增加或[減少]信號。

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
1624065377234

差異網絡分析僅適用于配對數據集。如果有更多的數據集進行比較,我們可以直接顯示每個數據集中任意兩個細胞群之間的交互次數或交互強度。

為了更好地控制不同數據集中推斷網絡的節點大小和邊緣權重,我們計算每個細胞組的最大細胞數量以及所有數據集中交互(或交互權重)的最大數量。

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]))
}
1624065400948

不同細胞類型之間相互作用或交互強度的差異

為了簡化復雜的網絡,并深入了解細胞類型級別的細胞通信,我們可以根據定義的細胞群聚合細胞-細胞通信。在這里,我們將細胞群分為三種細胞類型,然后重新合并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]))
}
1624065422291

此外,我們還可以使用圓圖顯示任意兩種細胞類型之間的交互或交互強度的差異。與第一個數據集相比,紅色(或藍色)色邊緣表示第二個數據集中的信號增加(或減少)。

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)
1624065443844

比較 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)
1624065466273

從散點圖中,我們可以看到與 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
1624065498013
# 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
1624065539434
netVisual_embeddingPairwiseZoomIn(cellchat, type = "structural", nCol = 2)
#> 2D visualization of signaling networks from datasets 1 2
1624065564689

計算和可視化通路距離

我們可以根據信號網絡在共享雙維空間中的歐幾里德距離來識別差異較大(或更少)的信號網絡。更大的距離意味著兩個數據集之間的通信網絡在功能或結構相似性方面存在更大的差異。NB:我們只計算兩個數據集之間重疊信號通路的距離。此處未考慮僅在一個數據集中標識的信號通路。如果有三個以上的數據集,可以通過在函數rankSimilarity中定義comparison進行對比。

rankSimilarity(cellchat, type = "functional")
#> Compute the distance of signaling networks between datasets 1 2
1624065584524

識別并可視化保守和環境特異的信號通路

通過比較每個信號通路的信息流/交互,我們可以識別信號通路,(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
1624065611339

比較與每個細胞群相關的傳出(或傳入)信號

上述分析將傳出和傳入信號的信息匯總在一起。我們還可以比較兩個數據集之間的傳出(或傳入)信號模式,從而識別顯示不同信號模式的信號通路/受配體。

我們可以將來自不同數據集的所有已識別的信號通路進行組合,從而并排比較它們,包括傳出信號、傳入信號和整體信號,方法是將傳出和傳入信號聚合在一起。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"))
1624065681927
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"))
1624065706103
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"))
1624065725360

第三部分:識別上調和下調的信號配體對

我們可以比較由某些細胞群到其他細胞組的配體受體對調節的通信概率。這可以通過設置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
1624065746204

此外,我們可以在一個數據集中識別與另一個數據集相比,上升(增加)和下降調節(減少)信號配體受體對。這可以通過指定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
1624065768517

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
1624065793644

使用和弦圖可視化上調和下調的信號配體對

# 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]))
1624065819046

第四部分:使用層次結構圖、圓圖或和弦圖可視比較細胞-細胞通信

與單個數據集的 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]))
}
1624065839795
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"))
1624065862240
# 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'.
1624065881741

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'.
1624065909581

使用和弦圖,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]))
}
1624065931602
# 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)
}
1624065953691
# 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 '.
1624065985712

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.
1624066006370

保存合并的cellchat對象

saveRDS(cellchat, file = "cellchat_comparisonAnalysis_humanSkin_NL_vs_LS.rds")
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容