获取更好阅读体验:export包:将R语言的图表对象导出为PPT格式,再也不需用Ai作图了
1. 前言
R语言特别是R包
ggplot2
,可以制作出精美的图片,但有时也不尽人意,需要我们后期手动编辑。
一般是保存为PDF矢量图再导入到AI里进行编辑,但Ai(Adobe illustrator)有的伙伴不会用,或者没安装、太卡顿了,那有没有可以替代的方法呢?
答案就是使用R包
export
,它可以将R的绘图对象保存为PPT格式。这样我们就可以快速对图片进行修改和添加元素了。
实不相瞒,我硕士期间发表的文章和毕业论文就是用这个包来拼图的,完全没用Ai,笑死。
2. 安装
依赖包有点多,主要是office相关的,不过安装还算顺利。
install.packages("officer")
install.packages("rvg")
install.packages("openxlsx")
install.packages("ggplot2")
install.packages("flextable")
install.packages("xtable")
install.packages("rgl")
install.packages("stargazer")
install.packages("tikzDevice")
install.packages("xml2")
install.packages("broom")
install.packages("devtools")
library(devtools)
devtools::install_github("tomwenseleers/export")
载入:
library(export)
3. 图片输出PPT
这里以一个ggplot绘制的箱线图为例。
library(ggplot2)
iris$class = rep(c("A","B","C"), 50)
p <- ggplot(iris, aes(x = Species, y = Sepal.Length, color = class))
p <- p + geom_boxplot(width = 0.6, outlier.shape=NA) + setText(20, graph.theme = "bw")
p
开始导出:
graph2ppt(p, file = "boxplot.pptx", width = 4, height = 4)
graph2pdf(p, file = "boxplot.pdf", width = 4, height = 4)
graph2png(p, file = "boxplot.png", width = 4, height = 4)
graph2tif(p, file = "boxplot.tif", width = 4, height = 4)
graph2doc(p, file = "boxplot.docx")
可以看出,可以导出的格式有pptx、pdf、png、tif和docx,pdf和png就不必说了,ggsave和png/pdf函数都能实现。
其中导出的pptx格式打开可以看到,这里不是一张图片,而是由许多小元素小图层所组成的。
这就允许我们进行编辑了,放大/缩小、旋转、移动、删除等等操作,非常的方便。
不过这也带来一个问题,就是图层太多时,或导致卡顿,我遇到的典型的案例就是绘制热图,一个tile就是一个元素,动不动就可以上万个元素了。
解决办法有几个,第一,避免全选元素,特别是整体移动,不选择元素时其实并不卡;第二,热图导出为PDF,坐标轴另外保存,这样可以保证各种标签还是可编辑状态,最后组合在一起就行了。
相信用Ai也会很卡,这么多元素谁也遭不住。
导出热图:
library(pheatmap)
mydata = iris
pdata = mydata[, 1:4]
rownames(pdata) = paste0("Sample-", 1:nrow(mydata))
annotation_row = data.frame(Species = as.character(iris$Species), row.names = rownames(pdata))
p <- pheatmap(pdata,
fontsize_col = 6,
angle_col = 90,
show_rownames = FALSE,
show_colnames = TRUE,
scale = "row",
width = 15,
height = 15,
cluster_cols = TRUE,
cluster_rows = TRUE,
annotation_row = annotation_row,
border_color = NA,
annotation_names_row = TRUE
)
p
graph2ppt(p, file = "heatmap.pptx", width = 4, height = 4)
有时候分组图例会跑出边界、色阶不够长、色阶标签太少或不合适等等问题,都可以在PPT里解决。
另外,输出tif格式也是比较有用的,有些期刊要求图片格式是tif格式,以前我是用专门的转换软件手动转的,这里直接就能转,很方便。而且还能改变DPI:
graph2tif(p, file = "boxplot.tif", width = 4, height = 4, dpi = 1000)
默认是300,改成1000就清晰多了。
4. 非ggplot对象的输出
遗憾的是,这个包貌似只能接受ggplot对象,对于其他格式不太支持。
但是,我们还是有些方法进行转换的,比如Y叔的
ggplotify::as.ggplot()
函数可以帮助我们将其他类型的图形对象转换为ggplot格式。
如基础图形对象:
class(ggplotify::as.ggplot(~boxplot(iris[, 1:4])))
# 'gg' 'ggplot'
graph2ppt(ggplotify::as.ggplot(~boxplot(iris[, 1:4])), file = "base.pptx", width = 4, height = 4)
只需要在前面加个波浪号就行了。
更多转换可参考:
https://cran.r-project.org/web/packages/ggplotify/vignettes/ggplotify.html
5. 图片输出word
从上面可以看到图片也许输出到word文档,但一般不这样做,没啥作用。
有点作用的我觉得是表格输出word。
6. 表格输出word
表格输出word的功能不是export所具备的,但是我这里想到了,所以也提一下。
此功能可由
officer
包来实现。
library(officer)
doc = read_docx()
doc = body_add_table(doc, iris[1:10, ], style = "table_template")
print(doc, target = "output.docx")
看起来还不错,有潜力!
研究一下有哪些样式可以选择,应该是很方便的功能。
平时在word绘制表格都是先导出到excel里再粘贴到word里,再调格式,很是麻烦。
以前绘制三线表有用过
table1
包,不过已经忘了这么用了。。。
这期推送就分享到这里,如果老铁们有什么其他的骚操作,欢迎评论区留言讨论~
学习更多生信技巧,请持续关注【生信摆渡】。
觉得有帮助的朋友麻烦动动手指点个赞、分享和再看,下一期会更新更快哦~
版权归原作者 生信摆渡 所有, 如有侵权,请联系我们删除。