前段时间有一些业务上需要批量作图的场景。比如下面这种:
其实简单的R 拼图,我喜欢patchwork 的加减乘除。但这种4x4 布局的图片,对象又多,一个个创建不现实;代码写起来,也非常不优雅。
如果可以批量作图 + 批量拼图就好了。其实也很简单。
来试试吧。
这里直接用seurat 的示例数据:Seurat - Guided Clustering Tutorial • Seurat (satijalab.org)[2]
★There are 2,700 single cells that were sequenced on the Illumina NextSeq 500. The raw data can be found here[3]. ”
pbmc.data <- Read10X(data.dir = "/Users/appe/OneDrive - yzygn/15macbook/4_code/R/1-multiplot&dis/filtered_gene_bc_matrices/hg19")
pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200)
pbmc <- NormalizeData(pbmc) %>% FindVariableFeatures() %>%
ScaleData() %>% RunPCA()
dim(pbmc@reductions$pca)
> dim(pbmc@reductions$pca)
[1] 2700 50
pbmc <- RunUMAP(pbmc, dims = 1:50)
pbmc_df <- as.data.frame(cbind(Embeddings(pbmc, "pca"), Embeddings(pbmc, "umap")))
> colnames(pbmc_df)
[1] "PC_1" "PC_2" "PC_3" "PC_4" "PC_5" "PC_6" "PC_7" "PC_8" "PC_9"
[10] "PC_10" "PC_11" "PC_12" "PC_13" "PC_14" "PC_15" "PC_16" "PC_17" "PC_18"
[19] "PC_19" "PC_20" "PC_21" "PC_22" "PC_23" "PC_24" "PC_25" "PC_26" "PC_27"
[28] "PC_28" "PC_29" "PC_30" "PC_31" "PC_32" "PC_33" "PC_34" "PC_35" "PC_36"
[37] "PC_37" "PC_38" "PC_39" "PC_40" "PC_41" "PC_42" "PC_43" "PC_44" "PC_45"
[46] "PC_46" "PC_47" "PC_48" "PC_49" "PC_50" "UMAP_1" "UMAP_2"
因为仅仅是做绘图展示,这里我们用pca 得到的50个主成分绘制umap 结果,并用颜色深浅表示前20个pca 结果。
目前对于绘图,我主要使用的两个包是patchwork 和cowplot。
其实它们的绘图函数都是带有接收list 作为输入的选项。
也就是说,我们可以使用lapply 等循环操作,把一个个绘图对象保存到一个列表。再传递给对应的绘图函数。
my_umap_Plot <- function(pc){
ggplot(pbmc_df,
aes(UMAP_1, UMAP_2)) +
geom_point(aes_string(color = pc),
alpha = 0.7) +
scale_color_gradient(guide = "none",
low = "grey90",
high = "blue") +
ggtitle(pc) + theme_bw()
}
umap_list <- lapply(paste0("PC_",1:12), my_umap_Plot)
我们只画12个。
cowplot 中,主要通过plot_grid
完成图片的排列。
关于包含ggplot 对象的列表,通过参数plotList 传入:
★(optional) List of plots to display. Alternatively, the plots can be provided individually as the first n arguments of the function plot_grid (see examples). ”
另外,align = "v"
表示竖直方向对齐,align = "h"
表示水平方向对齐,ncol
与 nrow
控制行列数目。非常直观。
plot_grid(plotlist = umap_list, align = "h",
nrow = 3)
patchwork 提供了函数wrap_plots
,供我们进行拼图。
从说明书看,它是可以直接接受列表对象的:
★multiple
ggplot
s or a list containingggplot
objects ”
pp_patchwork <- wrap_plots(umap_list, byrow = T, nrow = 3)
这个个人认为更为优雅一些,如果拼图使用的绘图对象无需保存,我们直接利用管道符号,将ggplot 对象传递给拼图函数。
pp_cow <- lapply(paste0("PC_",1:12), my_umap_Plot) %>%
plot_grid(plotlist = ., align = "h",
nrow = 3)
pp_patchwork <- lapply(paste0("PC_",1:12), my_umap_Plot) %>%
wrap_plots(byrow = T, nrow = 3)
比如不同的拼接比例等等内容,可以参考:[[88-R可视化20-R的几种基于ggplot的拼图解决方案]]
如果是cowplot 用户,可以参考:Aligning plots • cowplot (wilkelab.org)[4]
[1]
Single-cell RNA-seq: Clustering Analysis | Introduction to single-cell RNA-seq (hbctraining.github.io): https://hbctraining.github.io/scRNA-seq_online/lessons/08_SC_clustering_quality_control.html#/
[2]
Seurat - Guided Clustering Tutorial • Seurat (satijalab.org): https://satijalab.org/seurat/articles/pbmc3k_tutorial.html
[3]
here: https://cf.10xgenomics.com/samples/cell/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz
[4]
Aligning plots • cowplot (wilkelab.org): https://wilkelab.org/cowplot/articles/aligning_plots.html