R绘图输出的pdf矢量图点太多如何处理-ggrastr包来帮你!
相信大家使用ggplot2绘制发表级图片时一定遇到过这样的问题:ggplot2一通操作画出一张美美的图,但有些细节使用代码调整实在费劲,此时最优解是输出pdf矢量图在本地电脑使用Adobe illustrator进行细节微调,但不巧的是由于点太多电脑直接卡爆,点一下需要反应20分钟。
相信大家使用ggplot2绘制发表级图片时一定遇到过这样的问题:ggplot2一通操作画出一张美美的图,但有些细节使用代码调整实在费劲,此时最优解是输出pdf矢量图在本地电脑使用Adobe illustrator进行细节微调,但不巧的是由于点太多电脑直接卡爆,点一下需要反应20分钟。
这个时候可以使用ggrastr包来将所有的点进行格栅化处理。以下举两个例子:
单细胞UMAP/tSNE图点的格栅化
现在单细胞动辄几十万个细胞,画出的UMAP/tSNE图点十分多,输出pdf需要将点格栅化,其他所有元素保持“矢量”状态。
安装ggrastr包很简单
install.packages("ggrastr")
直接使用ggrastr包的rasterise函数
DimPlot(sce.all, reduction = "umap.integrated", group.by = c('CellType'), label = TRUE, cols = clusters_cols) + labs(x = 'umap1', y = 'umap2', title = 'Celltype annotation') -> p.umapp.umap <- p.umap %>% ggrastr::rasterise(dpi = 300) p.umap
标准ggplot2绘图可以和上述一样,对ggplot2对象进行rasterise()
Seurat包的DimPlot有raster=TRUE这个参数可以实现,不过默认是在细胞数超过10万时才有效,但小于10万时,我们就可以用rasterise()函数实现同样的效果了。

放大看

可以看出来点已经被格栅化了,而文字线条等仍然是矢量。
火山图点的格栅化
创建一个简单的火山图:
Epi_DEGs <- FindMarkers(sce.all,ident.1 = 'Epithelial',only.pos = F,logfc.threshold =0,min.pct = 0)# 设置logfc.threshold =0,min.pct = 0将所有基因的差异分析结果返回dim(Epi_DEGs)# 38444 5Epi_DEGs$label <- ifelse(Epi_DEGs$p_val_adj<0.05&abs(Epi_DEGs$avg_log2FC)>1,ifelse(Epi_DEGs$avg_log2FC>0,"up","down"),"no")Epi_DEGs$label <- factor(Epi_DEGs$label,levels = c("up","down","no"))table(Epi_DEGs$label)up_label <- paste0("up:",table(Epi_DEGs$label)["up"])down_label <- paste0("down:",table(Epi_DEGs$label)["down"])no_label <- paste0("no_sig:",table(Epi_DEGs$label)["no"])ggplot(Epi_DEGs)+geom_point(aes(avg_log2FC,-log10(p_val_adj),color=label))+ scale_color_manual(values = c("up"="#d62728","down"="#1f77b4","no"="grey"), labels=c(up_label,down_label,no_label)) -> p
方式1
直接对ggplot2对象进行rasterise()
library(ggrastr)p <- ggrastr::rasterise(p,layers='Point',dpi = 300)
方式2
在ggplot2画图代码中对特定图层进行rasterise()
ggplot(Epi_DEGs)+ rasterise( geom_point(aes(avg_log2FC,-log10(p_val_adj),color=label)) ,dpi=300)+ scale_color_manual(values = c("up"="#d62728","down"="#1f77b4","no"="grey"), labels=c(up_label,down_label,no_label)) -> p
方式3
使用ggrastr包中的geom_point_rast替换geom_point
ggplot(Epi_DEGs)+ geom_point_rast(raster.dpi=300,aes(avg_log2FC,-log10(p_val_adj),color=label))+ scale_color_manual(values = c("up"="#d62728","down"="#1f77b4","no"="grey"), labels=c(up_label,down_label,no_label)) -> pp
效果:

放大看:
类似的,ggrastr提供了一些常用的图层格栅化函数,不过官方更建议使用rasterise()函数对图层进行格栅化。
-
geom_point_rast: raster scatter plots
-
geom_jitter_rast: raster jittered scatter plots
-
geom_boxplot_jitter: boxplots that allows to jitter and rasterize outlier points
-
geom_tile_rast: raster heatmap
-
geom_beeswarm_rast: raster bee swarm plots geom_quasirandom_rast: raster quasirandom scatter plot
ggrastr官方说明链接:https://htmlpreview.github.io/?https://raw.githubusercontent.com/VPetukhov/ggrastr/main/doc/Raster_geoms.html
夜雨聆风
