一步到位!在R中直接绘制顶刊“半”矢量图表!

喵酱 SCIPainter 2023-06-02 09:58 发表于广东
绝大多数绘制的科研图表,我们都会存储为矢量格式(pdf、svg等),不仅随意缩放清晰度不变,也方便后期进行编辑修改。

但也有一些图表,图中包含了大量的图形元件,最典型的就是各降维散点型图表,如PCA、tSNE、UMAP等,图形中经常会包含几万到几十万个散点。如下文献中的tSNE图,共包含了二十多万个散点。

图片
Nat Commun,2022)

将这类图表存储为完全的矢量图是不合适的,不仅需要大量空间,在图形编辑器中的处理速度也会非常缓慢,甚至会出现电脑崩溃(或无响应)的情况。

常见处理方法为利用矢量图内兼容位图元素的特性,将其存储为“半”矢量图,即将特定的图形元件(如散点)栅格化,其它元件(如图例、坐标系、文字标签等)保留矢量,如下,仅将散点进行栅格化,其它保留矢量:

图片

之前在《如何将科研图片保存为“半”矢量图?》一文中分享绘制方法,即先保存为位图,再使用AI或者PS添加其它矢量图形元件,如文字标签、坐标轴等。

分享一个更便捷高效的实现途径,在R中绘图时即可完成对目标图形元件的栅格化,直接一步到位,输出发表级“半”矢量图表!

本期内容从R包开始层层递进学习,到文首tSNE案例图实战全囊括,让你直接拿捏无难度!

#相关R包安装:
install.packages('ggrastr') #稳定版
devtools::install_github('VPetukhov/ggrastr', build_vignettes = TRUE) #开发版

#相关R包载入:
library(ggplot2)
library(cols4all)
library(tidydr)
library(dplyr)
library(ggrastr)






1. R包学习





#测试数据载入:
##调用ggplot2内置钻石数据集
df <- diamonds
dim(df)
head(df)


图片

#散点图绘制:
p <- ggplot(data = df,
       aes(x = carat, y = price, color = cut)) +
  geom_point() +
  theme_bw()
p


图片

#栅格化散点图层:
rasterize(p, layers = 'Point', dpi = 30) #先调一个低分辨率,便于直观对比


图片

#存在多个图层时,可以只栅格化特定图层:
p1 <- ggplot() +
  rasterize(geom_point(data = df,
               aes(x = carat, y = price, color = cut)),
            dpi = 30) + #使用rasterize()嵌套需栅格化的特定图层即可
  geom_point(aes(x = runif(20, 0, 5),
              y = runif(20, 0, 20000)),
             size = 8, color = 'red', shape = 8) +
  theme_bw()
p1


图片

#栅格对象的比例大小快捷调整:
rasterize(p, layers = 'Point', dpi = 300, scale = 2.5) #scale大于1会放大


图片

rasterize(p, layers = 'Point', dpi = 300, scale = 0.5) #scale小于1会缩小


图片

大家学会了么?其实非常easy!

无废话总结:用rasterise()函数嵌套需栅格化的图层,结合dpi参数自定义栅格图层的分辨率,scale参数快捷对栅格图层散点大小进行调整。





2. 进阶实战训练——文献tSNE图复现





#载入本地tSNE散点图测试数据:
dt <- read.csv('tSNE_test.csv', header = T)
dim(dt) #20多万行散点数据,不适合存储为完全的矢量图
head(dt)


图片

#先绘制常规tSNE散点图:
pp <- ggplot(data = dt, aes(x = tSNE_1, y = tSNE_2)) +
  geom_point(aes(color = Tissue), size = 0.4, alpha = 0.8)
pp #散点较多,图表加载会较缓慢


图片

#将散点层转换为栅格图像:
pp1 <- ggplot(data = dt, aes(x = tSNE_1, y = tSNE_2)) +
  rasterise(geom_point(aes(color = Tissue), size = 0.4, alpha = 0.8),
            dpi = 30)
pp1 #低分辨率测试效果


图片

#测试无误,输出符合期刊需求的高分辨栅格散点:
pp2 <- ggplot(data = dt, aes(x = tSNE_1, y = tSNE_2)) +
  rasterise(geom_point(aes(color = Tissue), size = 0.4, alpha = 0.8),
            dpi = 300,
            scale = 0.6) #适当缩小散点
pp2


图片

#图表细节优化:

#自定义主题:
mytheme <- theme_void() + theme(plot.margin = margin(5.5,15,5.5,5.5))

pp3 <- pp2 +
  mytheme +
  theme_dr(xlength = 0.2,
           ylength = 0.2,
           arrow = grid::arrow(length = unit(0.1, "inches"),
                     ends = 'last', type = "closed")) + #添加箭头坐标系
  theme(panel.grid = element_blank()) +
  guides(color = guide_legend(override.aes = list(size = 5))) #修改图例散点大小
pp3


图片

#自定义配色:
c4a_gui()

mycol <- c4a('kelly', 20)
mycol2 <- colorRampPalette(c4a('paired', 12))(20) #色板颜色数不够的,可以扩展下

pp3 +
  scale_color_manual(values = mycol) +
  scale_fill_manual(values = mycol)


图片

pp3 + 
  scale_color_manual(values = mycol2) +
  scale_fill_manual(values = mycol2) #文章配色


图片

绘制满意后,直接存为矢量格式即可。

PS:本次案例的tSNE图,由于同一tissue在图中对应多个分散的位置,分群标签使用AI添加更简单。若是常规的tSNE,可直接在R中添加中心分群标签。往期相关内容感兴趣可戳:

1.《如何提取Seurat数据,绘制更加个性化的tSNE/UMAP图?》
2.《学术大牛文章的tSNE/UMAP是如何圈选的?》
3.《泰酷辣!360°无死角可视化你的降维数据!》

好啦,今天的分享就到这里!


参考资料&文献


参考资料
https://htmlpreview.github.io/?https://raw.githubusercontent.com/VPetukhov/ggrastr/main/doc/Raster_geoms.html

参考文献:
Wang, F., Ding, P., Liang, X. et al. Endothelial cell heterogeneity and microglia regulons revealed by a pig cell landscape at single-cell level. Nat Commun 13, 3620 (2022).


*未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。


图片
图片
# SCIPainter

基迪奥旗下绘图公众号

分享科研绘图技能与工具

欢迎关注与转发~


图片

你的好友拍了拍你

并请你帮她点一下“分享”~



收录于合集 #R语言绘图
 101
上一篇如何绘制PCR、qPCR孔板热图?下一篇如何绘制GO、KEGG富集分析气泡图?

微信扫一扫
关注该公众号