等高线指的是地形图上高程相等的相邻各点所连成的闭合曲线。把地面上海拔高度相同的点连成的闭合曲线,并垂直投影到一个水平面上,并按比例缩绘在图纸上,就得到等高线。 等高线也可以看作是不同海拔高度的水平面与实际地面的交线,所以等高线是闭合曲线。在等高线上标注的数字为该等高线的海拔。
流式等高线图
流式等高线图与流式散点图相似,一张流式等高线图也能同时显示两个通道的信息,所不同的是,它借助地理等高线图的形式。地理等高线图用封闭的环线代表海拔高度相同的地方,环线聚集越多,表示海拔高度变化越快,环线的中央区域表示海拔最高或者最低的区域。流式等高线图借助地理等高线图表示细胞的密集程度,流式等高线图的环线代表的是细胞密度相同的区域,所以,环线聚集越多的地方表示此区域细胞密度变化越快,细胞最稀疏的地方还是用散点表示,环线的中央区域代表细胞聚集的中心。
流式等高线图的意义和实际应用与流式散点图较为相似,可以看作是流式散点图的一个变体。相比之下,流式散点图更为直观,所以应用也更为广泛。当然,流式等高线图也有其自身的优点,它较能直观地体现细胞群的集中点,等密度环线的中央区域代表一个细胞群的集中点,一般代表一个细胞群,所以在某些情况下,流式等高线图比流式散点图更能直观地体现细胞的分群。
下图显示的是正常C57小鼠脾脏淋巴细胞分群的流式等高线图。
单细胞等高线图
其实单细胞数据也可利用等高线图来做展示,今天小编就来给大家演示一下。
我们利用这套经典的3k pbmc细胞样本来举例
#加载相关R包
library(Seurat)
library(ggplot2)
library(patchwork)
#加载pbmc3k这个seurat对象
pbmc=readRDS("pbmc3k_final.rds")
#绘制UMAP图
DimPlot(pbmc)
UMAP图如下:
接下来我们来用ggplot2这个包里面的geom_density_2d()来绘制等高线
首先需要先准备一下数据格式
#获取每个细胞UMAP的横纵坐标值
data=pbmc[["umap"]]@cell.embeddings
#转成数框
data <- as.data.frame(data)
#添加一列,细胞类型
data$cluster <- pbmc@active.ident
数据结构整理成这样
我们先来看一下第一种风格的单细胞等高线图
#横轴是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))))
效果如下:
第二种风格的单细胞等高线图
#横轴是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))))
效果如下:
最后我们把背景的网格线也删除
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))))
效果如下:
获取pbmc3k_final.rds文件☟☟☟