Colors, More Colors
最近接到一个需求,希望能够复现一张图,来自一篇单细胞的paper:
[Single-cell transcriptomic analysis of human lung provides insights
into the pathobiology of pulmonary fibrosis](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6580683/ )中的figure4A,并给了我一个数据:
avg_logFC | fibrosis_pct.exp | donor_pct.exp | cluster | gene |
---|---|---|---|---|
6.546466818 | 0.91 | 0.214 | Plasma Cells | IGKC |
6.107130048 | 0.72 | 0.103 | Plasma Cells | IGLC2 |
5.778478118 | 0.778 | 0.075 | Plasma Cells | IGHG3 |
5.66169075 | 0.734 | 0.063 | Plasma Cells | IGHG4 |
5.290993873 | 0.509 | 0.04 | Plasma Cells | IGLC3 |
5.205159287 | 0.799 | 0.068 | Plasma Cells | IGHG1 |
和一个期望的基因列表。
原本我以为这张图只是用dotplot做出来的,或者Seurat的DotPlot函数画出来的基因表达的点图,并希望能够提供Seurat的对象,这样多简单。
可惜,很快就发现,事情没这么简单。
其一,它有两个颜色的色阶,分别是fibrosis组和donor组的数据对应的范围映射,其二,它的x轴有gap,将不同的组分开了,其三,图上面还有一些注释,而且是对应的。
事实上,后面两个需求,用AI能够手动做到,但是前面那个分组话色阶,我还没见过能做到。
而且,经过交流,对方没有Seurat对象,连表达矩阵都没下载,所以我就得熄了用Seurat的DotPlot的心思,只能用ggplot2做了。
所以,先确定方案,这肯定是geom_point,颜色由某些数值映射得到,点的大小则是pct.exp映射,现在唯一需要解决的,就是如何在同一张图里映射两种颜色,如何将同一种cell cluster分为fibrosis和donor的组而且对应。
经过查找stackflow,我找到了解决方案,由此,只要我们有上述类似表格的数据,就能做类似的图,只需要替换对应的映射即可:
1 | #首先将文件另存为csv,方便读入。这一步手动在excel中完成。 |
其中,关于颜色区分映射,是由ggnewscale这个包做到的,这样我们就可以不用使用极其复杂的函数就能够做出这张图。
事实上,这张图是用Seurat的一个函数做的,可惜,这个函数只有在Seurat<3.0的版本才有,需要另外安装旧版本的Seurat,而现在版本的Seurat的DotPlot虽然也提供split.by函数,但我看源码非常复杂。
原本这张图是这么画的:
1 | # Contribution of different cell populations to pulmonary fibrosis pathways ------------------------------------------------ |
这个SplitDotPlotGG函数新版Seurat已经没咯~
虽然完全不知道为什么……但就是没了……而且现在看来感觉我的解决方案还是更简单一点,也不必须依赖于Seuratobject。
最后剩下的问题就是,这个将坐标轴间隔是怎么做到的,以及上面的文字注释是怎么做到的,我看了gg.gap包也没法实现,看来要学的还有很多。