R: fonction pour exporter actuellement active R plot à Powerpoint / Word/LibreOffice

actuellement, j'exporte toujours mes graphiques R à Powerpoint en format vectoriel en utilisant l'excellent ReporteRs package, comme dans

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

ce que je trouve gênant dans ce workflow, c'est que je dois maintenant envelopper mes commandes d'intrigue dans une fonction (avec print()lattice ou ggplot2 parcelles, ou tout simplement return(plot()) pour les tracés de base R), et que je n'aime pas avoir à spécifier manuellement les offsets et la taille (je préfère généralement juste obtenir un remplissage de presque page, graphique centré dans ma diapositive). Je me demandais juste si à la place il ne serait pas possible de faire votre parcelle d'abord (parcelle de base R,lattice plot ou ggplot2 plot) et ensuite définir une fonction export2PPT qui capture la sortie de votre carte graphique en fonction et les transmet à ReporteRs et addPlot exporter votre parcelle Powerpoint (centré et à l'échelle appropriée), par analogie avec la fonction dev.copy2pdf cela fonctionne de la même manière pour exporter en PDF?

Et une fois que nous avons un tel fonction, peut-être même modifier grDevices code source les fonctions windows() et savePlot() pour avoir un Fichier de commande...Enregistrer comme Powerpoint si l'on utilisait le windows() appareil? Ou est-ce quelque chose que les gens du noyau R doivent faire?

surtout pour une utilisation en salle de classe ce serait très pratique, je pense, étant donné la dominance de MS Office/LibreOffice. (comme Powerpoint est beaucoup plus facile à éditer que PDF, permettant à l'un de faire les changements dans la mise en page finale des graphiques R, et la sortie vectorielle est au moins aussi bonne que PDF, plus la transparence est également entièrement prise en charge - pour PDF je trouve que l'importation dans Inkscape est souvent un peu buggy, à moins que l'on utilise Adobe Illustrator)

Quelqu'un qui saurait faire ça?

EDIT: pour la première partie de mon problème, je viens de trouver une solution, voir ma réponse ci-dessous

EDIT2: j'ai maintenant fait un [petit paquet export] avec fonctions d'aide graph2ppt et graph2doc pour exporter le graphique actif vers Powerpoint ou Word ainsi que table2doc,table2ppt et table2html pour exporter L'objet précédemment montré R stats vers une table Word, Powerpoint ou HTML, par exemple:

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(ggplot2)
qplot(Sepal.Length, Petal.Length, data = iris, color = Species, 
      size = Petal.Width, alpha = I(0.7))
graph2ppt(file="ggplot2_plot.pptx", width=6, height=5)
graph2doc(file="ggplot2_plot.docx", width=6, height=5)
# export of aov Anova output
fit=aov(yield ~ block + N * P + K, npk)
x=summary(fit)
table2ppt(x=x,file="table_aov.pptx")
table2doc(x=x,file="table_aov.docx")

Si quelqu'un trouve des bugs là laissez-moi savoir!

17
demandé sur Tom Wenseleers 2015-07-03 21:43:08

1 réponses

je viens de trouver la solution pratique suivante pour être en mesure d'exporter un tracé R dans le périphérique graphique actuellement actif à Powerpoint ou Word (ou LibreOffice Impress/Writer) dans le format modifiable (DrawingML) vector comme un one-liner, avec un support complet pour la transparence, etc :

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,...)

Exemple pour exporter 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

qui après clic droit dans PPT sur "ungroup" peut être vu pour être bien dans le vecteur format:

enter image description here

Exemple pour exporter ggplot2 plot de Powerpoint ou 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)

Exporter de la base de R parcelles:

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

Si aspectr est nul les fonctions ci-dessus exporteront vers Word ou PPT dans le rapport courant de l'aspect de la parcelle dans le dispositif, sinon il exportera avec le rapport d'aspect donné, en utilisant l'échelle donnée (comme un % de la largeur totale ou la hauteur de la diapositive ou du document hors marges). De Word ou PPT ces graphiques exportent aussi parfaitement à (format vectoriel) PDF en utilisant le fichier...Enregistrer sous...PDF, et il est beaucoup plus facile de faire des modifications mineures à la mise en page que ce qui est possible en éditant directement dans le PDF.

Une autre option append=TRUE ou FALSE pour ajouter ou remplacer un fichier donné pourrait encore être nice même si.

si les personnes du noyau R souhaitent inclure cette fonctionnalité dans grDevices veuillez ne serait super pratique pour une utilisation dans la salle de classe, je pense que, compte tenu de la domination et de l'utilisation de la suite Office!

EDIT: j'ai maintenant enveloppé une fonction similaire à celle ci-dessus dans un petit paquet export : https://github.com/tomwenseleers/export

27
répondu Tom Wenseleers 2015-08-03 15:47:53