211-用代码得到的图如何更方便达到发表级别呢?
刘小泽写于2020.10.26
需求由来
我们很多时候直接从上游、下游分析得到的图片,是达不到投稿要求的,尤其是大小、线条粗细、字体、大小等等,这也是非常让人头疼的事情
举个例子
你的火山图用代码做出来(如下),可能不会在意这么多细节,数字、趋势是你关注的。
但真要投稿了,必须保证一个slide中(一般都是A4 大小)可以容纳多个图片,而且排列分布要合理,并且四周要留白,还需要留出figure legends的位置
比如已发表的文章中,可能是这样的:
总之,尽可能将图缩小,同时保证细节不损失,字和线条能看清
调整图片的方式
一般常用的有AI和PPT两种,AI最好导出eps格式,PPT可能是更多人使用的工具,那么如何将图片导出为PPT格式,我们之前也介绍过: 再也不用费力调整GO富集分析的输出图片了
非常值得注意的问题
请注意,如果图片中包含的点太多(例如相关性散点图、火山图等等),你的PPT打开的那一刻,很可能就出现了卡顿,更不用说后期再缩放调整了。当然,也许你说开始先把点和线组合起来,后面直接对它们缩放是不是就好一点呢?我感觉帮助不大,当你组合的时候,如果点特别多,卡顿还是会发生
如何比较快的完成一幅图的修改呢?
第一步 初步确定图片的形状
在导出之前,就最好先想想我要得到的图片是什么形状的:是偏正方形还是长方形。大小可以不用担心,后期缩放完全没问题,重点就是对于形状的确定,因为你导出为长方形的图,后面再怎么操作,也不会得到正方形,同时又保证点不会扭曲畸变
比如,我想得到发表级别的正方形的图,那么我在导出时,就在Rstudio中将这个预览窗口调成差不多正方形(也不用那么精确),然后这样保存的图就是基本正方形的了
第二步 保证图片边框清晰可见
这一步是为了将图片缩小后,我们依然可以看到边框,所以一开始可以设置大一点(比如2-3 pt),而如果一开始就设置1pt,后面基本就看不清了
这个的实现,全靠ggplot
的theme
theme(axis.title.x=element_blank(), #隐藏x轴title
axis.title.y=element_blank(), #隐藏y轴title
axis.text.x=element_blank(), #隐藏x轴刻度对应的名称
axis.text.y=element_blank(), #隐藏y轴刻度对应的名称
panel.border = element_rect(fill=NA, colour = "black", size=3), #调整边框粗细
axis.ticks = element_line(size = 2),#调整刻度线粗细
panel.grid.major = element_blank(), # 不要ggplot2背景线一
panel.grid.minor = element_blank(), # 不要ggplot2背景线二
legend.position = "none" )#隐藏legend
第三步 导出除了字以外的图片
一张图上除了点、线还有字,这里需要注意:我们导出图片(可以是png、tiff等),但不要文字,因为这里导出的文字意义不大(即使你可以设置好大小、字体,但一般后续都还要重新来一遍)。
只要图片,类似下面这样:
第四步 PPT中插入图片,然后编辑文字
文字部分通过PPT的文本框,可以自定义字体、大小,非常方便。内容就根据原来代码得到的结果去复制粘贴
而且如果有多张类似的图(比如4张火山图),可以先做好一张,后面的直接复制粘贴文本框即可
最后
一张slide中,经过缩放图片,然后添加文字,就可以得到自己想要的图片布局。
而且后期即使再修改(比如调大图片)也不怕,文本框也同时变大、对齐即可,更重要的是,我们不会编辑到图片中的元素,因此不会出现图中点发生畸变的现象
总结
核心就是:不要试图手动修改图片中的元素(点、线)!
应该用代码生成除了文字外的图片=》导出(立刻将点、线”锁定“)=》我们只需手动编辑文字框(这也是比较安全、快捷修改图片的方式)