R: Функция для экспорта текущего активного R-графика в Powerpoint/Word/LibreOffice

В настоящее время я всегда экспортирую свои R-графики в Powerpoint в векторном формате, используя отличный пакет ReporteRs, как в

library(ReporteRs)
myplot = function() print(qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7)))
doc = pptx()
doc = addSlide(doc, slide.layout = "Blank") 
doc = addPlot( doc, myplot, vector.graphic = TRUE, fontname="Arial",
               offx = 0.1*dim(doc)$slide.dim["width"], offy = 0.05*dim(doc)$slide.dim["height"], 
               width = 0.8*dim(doc)$slide.dim["width"], height = 0.9*dim(doc)$slide.dim["height"])
writeDoc( doc, "plot.pptx") 

enter image description here

То, что я нахожу неудобным в этом рабочем процессе, состоит в том, что теперь мне нужно обернуть мои команды построения в функцию (с print() для lattice или ggplot2 графиков или просто return(plot()) для базовых графиков R) и что мне не нравится, когда нужно вручную указывать смещения и размер (обычно я предпочитаю просто получать заполнение по центру, центрированный график на моем слайде). Мне просто интересно, если вместо этого вы не сможете сделать свой график первым (базовый график R, график lattice или график ggplot2), а затем определить функцию export2PPT, которая фиксирует вывод вашего текущего графического устройства как функцию и передает ее на ReporteRs и addPlot, чтобы экспортировать ваш график как Powerpoint (с центрированием и соответствующим масштабированием), по аналогии с функцией dev.copy2pdf, которая работает так же, как экспортировать в PDF?

И как только мы получим такую ​​функцию, возможно даже изменим исходный код grDevices функций windows() и savePlot(), чтобы получить дополнительную команду File... Сохранить как Powerpoint, если вы использовали устройство windows()? Или это что-то для людей R Core?

Специально для использования в классе это было бы очень удобно, я думаю, учитывая доминирование MS Office/LibreOffice. (поскольку Powerpoint намного проще редактировать, чем PDF, что позволяет легко вносить небольшие изменения в окончательный макет R-графиков, а векторный вывод по меньшей мере так же хорош, как PDF, плюс прозрачность также полностью поддерживается - для PDF я считаю, что импорт в Inkscape часто бывает некорректно, если не использовать Adobe Illustrator)

Любой, кто знал бы, как это сделать?

EDIT: для первой части моей проблемы я просто нашел решение, см. мой ответ ниже

EDIT2: теперь я сделал [small package export] со вспомогательными функциями graph2ppt и graph2doc для экспорта текущего активный график для Powerpoint или Word, а также table2doc, table2ppt и table2html для экспорта ранее указанного объекта R-статистики в таблицу Word, Powerpoint или HTML, например

install.packages("rJava")
install.packages("ReporteRs")
install.packages("ReporteRsjars")
install.packages("ggplot2")
install.packages("rtable")
install.packages("xtable")
install.packages("taRifx")
install.packages("devtools")
library(devtools)
devtools::install_github('tomwenseleers/export',local=F)

library(export)

?graph2ppt
?table2doc

## export of ggplot2 plot
library(ggplot2)
qplot(Sepal.Length, Petal.Length, data = iris, color = Species, 
      size = Petal.Width, alpha = I(0.7))
graph2ppt(file="ggplot2 plot.pptx", aspectr=1.7)

# add 2nd slide with same graph in different aspect ratio
graph2ppt(file="ggplot2 plot.pptx", aspectr=1.3, append=T) 
# add 3d slide with same graph with fixed width & height
graph2ppt(file="ggplot2 plot.pptx", width=6, height=5, append=T) 

# export of aov Anova output
fit=aov(yield ~ block + N * P + K, npk)
summary(fit)
table2doc(file="table_aov.docx")
summary(fit)
table2doc(file="table_aov.docx",append=T,digits=4)
summary(fit)
table2doc(file="table_aov.docx",append=T,digits=4,digitspvals=1)
summary(fit)
table2html(file="table_aov.html")

Если кто-нибудь найдет какие-нибудь ошибки, сообщите мне!

Ответы

Ответ 1

Просто нашел следующее удобное решение, позволяющее экспортировать R-график в текущем активном графическом устройстве в Powerpoint или Word (или LibreOffice Impress/Writer) в редактируемом (DrawingML) векторном формате в виде однострочного изображения с полным поддержка прозрачности и т.д.:

export2office = function(file = "plot", type="PPT", scaling = 90, aspectr=NULL, vector.graphic = TRUE, fontname = "Arial", pointsize=20) {
  file=sub("^(.*)[.].*", "\\1", file)
  if (type=="PPT"|type=="PPTX") {ext=".pptx";type="PPT"} else {ext=".docx";type="DOC"}
  require(ReporteRs)
  captureplot = function() {p = invisible(recordPlot())
                          return(p)}
  p = captureplot()
  plotsize = dev.size()
  plotaspectr = plotsize[[1]]/plotsize[[2]]
  if (!is.null(aspectr)) plotaspectr=aspectr 
  myplot=function(pl=p) print(pl)
  if (type=="PPT") {doc = pptx();doc = addSlide(doc, slide.layout = "Blank");pagesize = dim(doc)$slide.dim} else {doc = docx();pagesize = dim(doc)$page-dim(doc)$margins[c(4,3)]}    
  pageaspectr = pagesize["width"]/pagesize["height"]
  if (pageaspectr>plotaspectr) {xf=plotaspectr/pageaspectr;yf=1} else {xf=1;yf=pageaspectr/plotaspectr}
  w = (scaling/100)*pagesize["width"]*xf;
  h = (scaling/100)*pagesize["height"]*yf
  if (type=="PPT") {doc = addPlot( doc, myplot, vector.graphic = vector.graphic, fontname = fontname, pointsize = pointsize,
                 offx = (pagesize["width"]-w)/2, offy = (pagesize["height"]-h)/2,
                 width = w, height = h) } else {doc = addPlot( doc, myplot, vector.graphic = vector.graphic, fontname = fontname, pointsize = pointsize,
                                                               width = w, height = h)}
  writeDoc( doc, paste0(file,ext) )  
}

export2ppt = function(type="PPT", ...) export2office(type=type,...)
export2doc = function(type="DOC", ...) export2office(type=type,...)

Пример экспорта lattice plot:

library(effects)
fit=lm(prestige ~ type + income*education, data=Prestige)
plot(Effect(c("income", "education"), fit),multiline=T, ci.style="bands")
export2ppt("effect plot.pptx")

enter image description here

который после щелчка правой кнопкой мыши в PPT на "ungroup" можно увидеть красиво в векторном формате:

enter image description here

Пример экспорта ggplot2 графика в Powerpoint или Word:

require(ggplot2)
qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7))
export2ppt(file="plot.pptx")

enter image description here

export2ppt(file="plot.pptx",aspectr=1.7,fontname="Times New Roman")

enter image description here

export2doc(file="plot.docx")
export2doc(file="plot.docx",aspectr=1.7)

Экспорт базовых графиков R:

boxplot(mpg~cyl,data=mtcars, main="Car Milage Data",xlab="Number of Cylinders", ylab="Miles Per Gallon",col="cyan2")
export2ppt(file="boxplot.pptx",aspectr=1.5)

enter image description here

heatmap(as.matrix(eurodist))
export2ppt(file="heatmap.pptx")

enter image description here

Если aspectr равно NULL, перечисленные выше функции будут экспортироваться в Word или PPT в текущее соотношение сторон графика в устройстве, в противном случае оно будет экспортироваться с заданным соотношением сторон, используя заданное масштабирование (в% от общего количества ширина или высота слайда или документа, исключая поля). Из Word или PPT эти графики также отлично экспортируются в (векторный формат) PDF с помощью File... Save as... PDF, и намного легче сделать небольшие изменения в макете, чем это возможно, непосредственно редактируя PDF.

Еще одна опция append=TRUE или FALSE для добавления или перезаписывания данного файла все равно может быть приятной.

Если люди R Core хотели бы включить эту функциональность в grDevices, пожалуйста, сделайте - было бы очень удобно для использования в классе, я думаю, учитывая доминирование и широкое использование пакета Office!

EDIT: теперь я обернул функцию, аналогичную приведенной выше в небольшом пакете export: https://github.com/tomwenseleers/export