简介
cellphoneDB 是最常见的进行细胞通讯分析的工具,但是其分析所需环境较为复杂而且容易产生各类报错。目前常用的细胞通讯分析还有CellChat,一款使用更容易且可视化结果更方便的R包(https://github.com/sqjin/CellChat)。
利用cellchat的结果复现下面这张图
image.png
(Wang, W. et al. Single-cell profiling identifies mechanisms of inflammatory heterogeneity in chronic rhinosinusitis. Nat. Immunol. 23, 1484-1494 (2022).)
方法
·cellchat 结果得到配受体数据
·ggplot绘制中间的连线图
·dotplot绘制两侧的气泡图
·patchwork进行拼图/AI拼图
实战
1.挑选配受体对
## 1.1挑选合适通路 ----
library(Seurat)
library(CellChat)
library(patchwork)
outdir <- './results/files/'
outdir2 <- './results/plots/'
# 读取cellchat对象
cellchat <- readRDS('cellchat.rds')
table(cellchat@meta$labels)#查看有哪些细胞类型
## 挑选细胞类型和关注的通路
pdf(file = paste0(outdir2, 'dotployt_inflammation.pdf'),width=20, height= 5)
sources = c(20:25)#设置sources cells对应的位置顺序
targets = c(1:25)#设置target cells的
p <- netVisual_bubble(cellchat, sources.use = sources, targets.use = targets,
signaling = c('MIF', 'CLEC', 'ICAM', 'CCL', 'CXCL', 'BAFF'),#关注的通路
angle.x = 90)
p
dev.off()
image.png
由于我们绘制的连线图需要发出和接受细胞分别对应的配受体基因,所以我们利用上面图中的数据来提取并整理成我们想要的数据类型,便于后续画图。
## 1.2提取数据 ----
# 提取画图数据
LR_data <- p[["data"]][,1:4]
LR_data <- LR_data[!is.na(LR_data$ligand), ]
table(LR_data$ligand)
# CCL5 CD69 CLEC2B CLEC2D CXCL16 ICAM1 ICAM2 MIF TNFSF13B
table(LR_data$receptor)
# CCR1 CD74_CD44 CD74_CXCR4 CXCR6 ITGAL ITGAL_ITGB2 ITGAM_ITGB2 ITGAX_ITGB2 KLRB1 SPN TNFRSF13B TNFRSF13C
# 更改信息,复杂的受体只保留后者
LR_data$receptor <- gsub('CD74_CD44', 'CD44', LR_data$receptor)
LR_data$receptor <- gsub('CD74_CXCR4', 'CXCR4', LR_data$receptor)
LR_data$receptor <- gsub('ITGAL_ITGB2', 'ITGB2', LR_data$receptor)
LR_data$receptor <- gsub('ITGAM_ITGB2', 'ITGB2', LR_data$receptor)
LR_data$receptor <- gsub('ITGAX_ITGB2', 'ITGB2', LR_data$receptor)
table(LR_data$ligand)
# CCL5 CD69 CLEC2B CLEC2D CXCL16 ICAM1 ICAM2 MIF TNFSF13B #9
table(LR_data$receptor)
# CCR1 CD44 CXCR4 CXCR6 ITGAL ITGB2 KLRB1 SPN TNFRSF13B TNFRSF13C
write.table(LR_data, file = file.path(outdir, "LR_data.csv"),
quote = F, sep = ",", row.names = T)
绘制连线图参考了该帖子(https://mp.weixin.qq.com/s/4YZCqCRF21XepavYTNtbUg),数据需要整理成下面这种格式,即每个对应的配受体放在同一行;每个配体/受体都有确定的顺序,目的是和气泡图的基因相对应起来(避免混淆可以直接按照默认的字母顺序)
image.png
# 整理数据
data <- data.frame(sou=LR_data$ligand,
x1=rep(2,length(LR_data$ligand)),
net_y1='',
tar=LR_data$receptor,
x2=rep(3,length(LR_data$receptor)),
net_y2='')
colnames(LR_data_name) <- c('sou', 'number')
# 找到 LR_data_name 中 sou 对应的行索引
match_indices <- match(data$sou, LR_data_name$sou)
# 将 LR_data_name 中对应行的 num 列的值赋给 LR_data 中的 net_y1 列
data$net_y1 <- LR_data_name$num[match_indices]
# 同理
colnames(LR_data_name) <- c('tar', 'number')
match_indices <- match(data$tar, LR_data_name$tar)
data$net_y2 <- LR_data_name$num[match_indices]
data <- unique(data)
write.table(data, file = file.path(outdir, "data_dotplot.csv"),
quote = F, sep = ",", row.names = T)
2.绘制连线图
## 连线图
p2 <- ggplot(data)+
geom_segment(aes(x1,net_y1,xend=x2,yend=net_y2),
size=0.5,color=c('black','black','black','black','#CC0033',
'black','black','black','black','black',
'black','black','black'))+#虚线 ,linetype = "dashed"
#设置了红色为了突出显示某个配受体对
geom_point(aes(x=x1,y=net_y1),size=1, fill="#3cb346", color="#3cb346",
stroke=1, shape = 21)+
geom_point(aes(x=x2,y=net_y2),size=1, fill="#44c1f0", color="#44c1f0",
stroke=1, shape = 21)+
scale_y_continuous(limits = c(1, 10),expand = expansion(add=c(0.5,0.7)))+
scale_x_continuous(expand = expansion(0,0.1))+
theme_void()
p2
ggsave(file.path(outdir2, 'mid_line.pdf'),
p2, width = 2, height = 5)
结果如下:
image.png
3.绘制气泡图
两侧气泡图的绘制比较简单,就是简单的dotplot,调整主题颜色和坐标位置等参数即可,但是原图中气泡的边框设置了颜色,并且气泡间有连线,这个方法我没有找到(欢迎补充!)
## 3.1左侧
features_1 <- c(LR_data_name$genes[1:9])
p1 <- DotPlot(object = seurat_obj[, seurat_obj[["cell_type"]] == c('NK CD56highCD16low', 'NK CD56lowCD16high', 'CD14+ Monocytes', 'CD14+CD16+ Monocytes', 'CD16+ Monocytes', 'Dendritic cells' )], #可以用全部的细胞类型,也可以挑选一部分
features = features_1, assay = "RNA") +
guides(color = guide_colorbar(title = 'Average Expression')) +
scale_color_gradientn(colours = c('white','grey',"black"))+#主题颜色
coord_flip() +
theme(axis.title = element_blank(),#标题为空
legend.position = "left",
plot.margin = unit(c(0.5,0,0.5,0.5), 'cm'),
axis.line = element_blank(),#去除坐标轴线
axis.ticks = element_line(size = 0.2),#刻度线
panel.border = element_rect(color = "black",fill=NA, size = 0.1),#图形边框
panel.grid.major = element_line(size = 0.1,color = 'black',linetype = 2),# 显示主网格线
axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=0.1)) +#坐标轴字体
scale_x_discrete(position = "top") + scale_y_discrete(position = "right")
p1
ggsave(file.path(outdir2, 'left_target.pdf'),
p1, width = 4.5, height = 5.5)
## 3.2右侧
features_2 <- c(LR_data_name$genes[10:19])
p3 <- DotPlot(object = seurat_obj, features = features_2, assay = "RNA") +
guides(color = guide_colorbar(title = 'Average Expression')) +
scale_color_gradientn(colours = c('white','grey',"black"))+#主题颜色
coord_flip() +
theme(axis.title = element_blank(),
plot.margin = unit(c(0.5,0.5,0.5,0), 'cm'),
axis.line = element_blank(),#去除坐标轴线
axis.ticks = element_line(size = 0.2),#刻度线
panel.border = element_rect(color = "black",fill=NA, size = 0.1),#图形边框
panel.grid.major = element_line(size = 0.1,color = 'black',linetype = 2),# 显示主网格线
axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=0.1)) +
scale_y_discrete(position = "right") +
NoLegend()
p3
ggsave(file.path(outdir2, 'right_source.pdf'),
p3, width = 7, height = 6)
image.png
image.png
后续进行拼图即可得到类似的结果~
image.png
(每帖分享:不去美化自己没走过的路,要去创造美好)