单细胞等高线图

2022-09-21 16:47:52 浏览数 (1)

等高线指的是地形图上高程相等的相邻各点所连成的闭合曲线。把地面上海拔高度相同的点连成的闭合曲线,并垂直投影到一个水平面上,并按比例缩绘在图纸上,就得到等高线。 等高线也可以看作是不同海拔高度的水平面与实际地面的交线,所以等高线是闭合曲线。在等高线上标注的数字为该等高线的海拔。

流式等高线图

  流式等高线图与流式散点图相似,一张流式等高线图也能同时显示两个通道的信息,所不同的是,它借助地理等高线图的形式。地理等高线图用封闭的环线代表海拔高度相同的地方,环线聚集越多,表示海拔高度变化越快,环线的中央区域表示海拔最高或者最低的区域。流式等高线图借助地理等高线图表示细胞的密集程度,流式等高线图的环线代表的是细胞密度相同的区域,所以,环线聚集越多的地方表示此区域细胞密度变化越快,细胞最稀疏的地方还是用散点表示,环线的中央区域代表细胞聚集的中心。

  流式等高线图的意义和实际应用与流式散点图较为相似,可以看作是流式散点图的一个变体。相比之下,流式散点图更为直观,所以应用也更为广泛。当然,流式等高线图也有其自身的优点,它较能直观地体现细胞群的集中点,等密度环线的中央区域代表一个细胞群的集中点,一般代表一个细胞群,所以在某些情况下,流式等高线图比流式散点图更能直观地体现细胞的分群。

  下图显示的是正常C57小鼠脾脏淋巴细胞分群的流式等高线图。

单细胞等高线图

其实单细胞数据也可利用等高线图来做展示,今天小编就来给大家演示一下。

我们利用这套经典的3k pbmc细胞样本来举例

代码语言:javascript复制
#加载相关R包
library(Seurat)
library(ggplot2)
library(patchwork)
#加载pbmc3k这个seurat对象
pbmc=readRDS("pbmc3k_final.rds")
#绘制UMAP图
DimPlot(pbmc)

UMAP图如下:

接下来我们来用ggplot2这个包里面的geom_density_2d()来绘制等高线

首先需要先准备一下数据格式

代码语言:javascript复制
#获取每个细胞UMAP的横纵坐标值
data=pbmc[["umap"]]@cell.embeddings
#转成数框
data <- as.data.frame(data)
#添加一列,细胞类型
data$cluster <- pbmc@active.ident

数据结构整理成这样

我们先来看一下第一种风格的单细胞等高线图

代码语言:javascript复制
#横轴是UMAP_1,纵轴是UMAP_2,点的颜色根据cluster来设定
ggplot(data) 
  geom_point(aes(x=UMAP_1, y=UMAP_2,color=cluster)) 
  geom_density_2d(aes(x=UMAP_1, y=UMAP_2))  #绘制密度曲线,也就是等高线
  theme_bw()    #黑白背景
  #避免等高线超出绘图区域,调节一下横轴和纵轴的范围
  scale_x_continuous(limits=c(min(data$UMAP_1) - 0.1*diff(range(data$UMAP_1)),
                              max(data$UMAP_1)   0.1*diff(range(data$UMAP_1)))) 
  scale_y_continuous(limits=c(min(data$UMAP_2) - 0.1*diff(range(data$UMAP_2)),
                              max(data$UMAP_2)   0.1*diff(range(data$UMAP_2))))

效果如下:

第二种风格的单细胞等高线图

代码语言:javascript复制
#横轴是UMAP_1,纵轴是UMAP_2,点的颜色都设置成空color=NA
ggplot(data) 
  geom_point(aes(x=UMAP_1, y=UMAP_2),color=NA) 
  geom_density_2d(aes(x=UMAP_1, y=UMAP_2)) 
  theme_bw() 
  scale_x_continuous(limits=c(min(data$UMAP_1) - 0.1*diff(range(data$UMAP_1)),
                              max(data$UMAP_1)   0.1*diff(range(data$UMAP_1)))) 
  scale_y_continuous(limits=c(min(data$UMAP_2) - 0.1*diff(range(data$UMAP_2)),
                              max(data$UMAP_2)   0.1*diff(range(data$UMAP_2))))

效果如下:

最后我们把背景的网格线也删除

代码语言:javascript复制
ggplot(data) 
  geom_point(aes(x=UMAP_1, y=UMAP_2),color=NA) 
  geom_density_2d(aes(x=UMAP_1, y=UMAP_2)) 
  theme_bw() 
  #删除网格线
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank()) 
  scale_x_continuous(limits=c(min(data$UMAP_1) - 0.1*diff(range(data$UMAP_1)),
                              max(data$UMAP_1)   0.1*diff(range(data$UMAP_1)))) 
  scale_y_continuous(limits=c(min(data$UMAP_2) - 0.1*diff(range(data$UMAP_2)),
                              max(data$UMAP_2)   0.1*diff(range(data$UMAP_2))))

效果如下:

0 人点赞