170-心疼我下午的俩小时...
刘小泽写于2020.2.24
写这篇的目的是为了提醒自己,任何任何时候,都要抱着代码解决问题的思想,一定不要白白浪费时间…
故事缘由
接到一项任务,把panther网页工具的GO分析结果,手工做成dotplot
关于Panther富集分析和我们常用的R语言对比,可以看: 什么?R语言做的GO富集结果和在线工具不一致?真的是这样吗
然后想要自己DIY作图,用ggplot2代码可以自定义更多的东西,可以看: 一个看似简单的需求–修改富集分析的dotplot图
从拿到Excel表格,到出图其实还蛮快的,代码都在上面👆的推送中。这也不是今天的主题,今天是想聊聊,出图后怎么往下精细化操作?
要求是:四个图,放在同一张slides上,要求字号为6号arial
因此,首先我想到的是字体问题:如果直接导出为图片,那么后续肯定没法调字体
那么想办法先解决字体
如何做好字体?
之前Y叔在他的yyplot
包中加入了这个功能,假入做的ggplot图赋值为了p。我想的是:先把字体搞好,字号等到时候在PPT中调整吧
library(yyplot)
p_arial <- set_font(p, family="Arial", size=3, color="black")
下面同时把四个图都做好字体【不过现在想想,当时这个决定不正确】
然后又想到,为什么不直接导出为PPT呢?
其实这里暗自欢喜了一小下,因为一般的做法都是先导出为EMF格式,然后再放到PPT中
假入你需要导出为EMF
也放上代码吧,虽然现在有了更好的方式
if(F){
# install.packages("devEMF")
library(devEMF)
emf(file = "p.emf", emfPlus = FALSE)
# 这个代码就是自定义dotplot的,可以同时看上面👆的推送链接
ggplot(test,aes(x = fold,y = Description))+
geom_point(aes(color = P.adjust,
size = Count))+
scale_color_continuous(low="red", high="blue", name = 'P.adjust', guide=guide_colorbar(reverse=TRUE),
labels = function(x)format(x,scientific = F))+
xlab("Fold Enrichment")+
theme_bw()
dev.off()
}
这样,我分别得到了4个PPT文件
下面的任务,其实就是把四个图,整合在一个slide中,顺便也温习了一下PPT的操作【唉不到最后关头,一般是不会打开PPT的。虽然旁边花花就是个PPT大神】
开始在PPT中的整合工作,浪费了我2个小时
首先要把页面设置成竖向,这个是在Design =》 Slide Size =》可以先用Letter Paper(不合适以后再调),然后注意调整Slides这个选项(调整为竖向)
然后,经历了拆分、组合、调字号、设置大小一致等等非常非常繁琐的操作【而我发现,现在已经不能胜任这种总是需要点点点+各种移动、复制的操作了】
这中间,经历了:
- 只调整了图片没同时调整图例,导致最后点的大小和图中不一致;
- 左侧的GO说明,位置调来调去,还不能批量对齐,因为它们的文本框长度不一致,我要一个一个手动去调整
- 组合后的图进行拆分,往往在移动过程中丢了某处,后来发现时也为时已晚
唉,说多了都是泪,就连今天晚上做的西红柿鸡蛋面都是无滋无味的了
两个小时能干啥?看个电影?学个流程?都不错!但我就弄了下面这张。看着还整齐吧。但还没完,仔细看又出了新问题
因为我是手动调整的图片,为了保证它们组合后长宽一致。得到的原图它们本来的宽度和高度是不一样的,于是手动修改后,有的图(就像右边👉这个)中的点就被挤歪了,本来都是圆形的,现在成了椭圆形。于是上面的两个小时”成果“也算是报废了
思考失败的原因
这次浪费的2小时,再一次提醒了我,时刻记得:只要让你去做重复性工作的,且要多次循环的。那么做之前,不妨想一想:能不能让代码帮我们完成那些繁琐的工作呢?
总结一下原因:为什么最后的图会扁?我即便是锁定长宽比缩放,也是有的图点圆,有的图中点不圆。这是因为,我这四个图片本身的长宽就不一致啊!
我导出的时候,只想着把它们导出为PPT,后续调整就很容易了。但忽略了最开始的问题,如果多张图一开始的大小就不一样,那么后来肯定有某几张会发生畸变。
除非,一开始就让大家的大小一致,等长等宽的图,再怎么变化,最后也是一致的。而且这种方式调整起来更简单
因此,又花了几分钟,拯救了之前浪费的2个小时
方法就是:利用拼图神器:patchwork
,花花之前写过推送:
大佬新包patchwork:可能是迄今为止最优秀的拼图包
library(patchwork) # 可以组合成长宽一致的图(a/b/m/n表示4张图)
p2 = a + b + m + n + plot_layout(ncol = 2)
然后再把p2导出为PPT【注意这里设置的长款,会直接影响结果PPT中各种图的形状,可以多设置几次看看结果】
library(export)
graph2ppt(p2,"p2.pptx",width = 20, height = 20)
因此,这样打开PPT,就是我之前花了2小时做的结果,而且比我的结果还要好,因为所有的图都是原图,点都是圆形,后续只需要调一下字体和字号就行了
总结
今天的这个坑,我认了,因为也让我更清楚地明白:如果不想后面烦心,那就一开始多动动脑;如果遇到了问题,先不要着急往下做,马上回忆一下,哪些知识能够帮助到自己,这次我就没有想要事先拼好图再导出PPT。不过以后这个操作应该要牢记于心了。当然,希望我今天的小事件能帮助到你