我在CNS图表复现09—上皮细胞可以区分为恶性与否 提到了一个很有意思的现象,就是把上皮细胞分群后,可以看到有一些亚群是具有病人特异性,但是也有不少亚群是跨越了病人存在的。
当时我展现这一现象使用的可视化方法就是balloonplot函数啦,它来自于gplots这个包!而且我还创造了一个模拟数据,如下所示;
n=10 *sample(100 ,9 );n cancer=rep(paste0('c' ,1 :9 ),n) table(cancer) p=c(rep(paste0('p' ,1 :5 ),n[1 :5 ]), sample(paste0('p' ,1 :5 ),sum(n[6 :9 ]),replace = T )) table(p) table(cancer,p)library (gplots) balloonplot(table(cancer,p))library (vcd) dat=table(cancer,p) mosaic(dat,shade=T ,legend=T ) dat
使用这个模拟数据,比较了balloonplot和马赛克图的可视化结果,见:展示细胞比例变化之balloonplot和马赛克图
但是有不少粉丝留言说,两个图都不好看。其实是他们完全搞错了我教程的重心,绘图根本就是小儿科的事情,最重要的是上面的数据模拟代码,这个才是技术含量!
如果你仅仅是需要好看的图,大把的成熟的R包,供你使用,比如 ggalluvial 可以绘制桑基图,代码如下:
df=data.frame( cancer,p) head(df)# 两列数据,互相之间有对应关系,可以绘制桑基图 library (ggplot2)library (ggalluvial) options(stringsAsFactors = F ) gg <- ggplot(df, aes(axis1 = cancer, axis2 = p ));gg gg <- gg + geom_alluvium(aes(fill = as.factor(cancer)), width = 2 /5 , discern = FALSE );gg gg <- gg +geom_stratum(width = 2 /5 , discern = FALSE );gg#添加文本 gg <- gg +geom_text(stat = "stratum" , discern = FALSE , aes(label = after_stat(stratum))) ;gg gg <- gg + theme(legend.position = "none" ,#去除刻度线和背景颜色 panel.background = element_blank(), axis.ticks = element_blank(), axis.text.y = element_blank(), axis.text.x = element_text(size =15 ,colour = "black" ),#坐标轴名 axis.title = element_blank()) + scale_x_discrete(position = "top" );gg #坐标轴位置
关键是两列数据,互相之间有对应关系,可以绘制桑基图,效果如下所示:
桑基图 当然了,我这个是模拟数据,前面的c1到c5,都是病人特异性的,每个病人一个独立单细胞亚群,通常是恶性细胞。
但是后面的 c6和c9都是涵盖了5个病人的正常细胞,从上面的桑基图可以很清晰的看出来这一点,是不是非常直观!!!
桑基图上镜率持续走高比如2021的纯生物信息学文献:《Conserved pan-cancer microenvironment subtypes predict response to immunotherapy》,就有一个看起来超级复杂的桑基图,图例:(C) Sankey plot showing antigenicity and TMB (left) per TME subtype linked to mutation group (right) across TCGA patients at the pan-cancer level.
这个时候 ggalluvial 可以绘制桑基图,但是它只能是绘制一个框架,这里面的大量的插图都是AI制作和拼接。
现在,桑基图你知道它需要的输入数据了吗?你会画了吗?我每个教程给出来的代码都是复制粘贴即可运行,如果你都不去动手, 是永远不可能学会哦!
文末友情推荐 与十万人一起学生信,你值得拥有下面的学习班: