Redirecting R graphs to MS Word - r

I wonder how to redirect R graphs to MS Word? Like sink() redirect the R output to any file but not the graphs. I tried R2Wd but sometimes it doesn't work properly. Any comment and help will be highly appreciated. Thanks

To answer your direct question, the best way to get the results of R scripts and plots into word is probably via some form of Sweave. Look up odfweave to send R output to a LibreOffice file that can then be converted to word, or even opened directly in Word if you have the right plugin.
To create plots that can be editable (i.e you can alter the look of plots, move the legend etc) I would recommend saving the plot to an svg format (scalable vector graphic) that you can then edit using the excellent free vector graphics app inkscape.
For instance, if I create my ggplot2 graph as an object
library(ggplot2)
dataframe<-data.frame(fac=factor(c(1:4)),data1=rnorm(400,100,sd=15))
dataframe$data2<-dataframe$data1*c(0.25,0.5,0.75,1)
testplot<-qplot(x=fac, y=data2,data=dataframe, colour=fac, geom=c("boxplot", "jitter"))
You can use the Cairo package, which allows creation of svg files, I can then edit these in Inkscape.
library(Cairo)
Cairo(600,600,file="testplot.svg",type="svg",bg="transparent",pointsize=8, units="px",dpi=400)
testplot
dev.off()
Cairo(1200,1200,file="testplot12200.png",type="png",bg="transparent",pointsize=12, units="px",dpi=200)
testplot
dev.off()
For more info read this previous question that has more good answers Create Editable plots from R
Also, you can follow this advice from Hadley, and save the actual ggplot2 object, then load it later and modify it
save(testplot, file = "test-plot.rdata")
# Time passes and you start a new R session
load("test-plot.rdata")
testplot + opts(legend.position = "none")
testplot + geom_point()

To get sink() like behavior with MSword look at the wdTxtStart function in the TeachingDemos package. This uses R2wd internally, so you will see similar functionality, this just sends everything you do to the word document.
Graphs are not sent automatically since you may be adding to them, but once you know you are finished with the graph you can use wdtxtPlot to send the current graph to the word document.
If you know what you want to do ahead of time then sweave or something similar is probably the better approach (as has already been mentioned). The group that created Rexcel are also working on Sword that does sweave like things within MSword.

Related

How to using code to save plots in Rstudio?

Is there any way to save the plots by code in RStudio?
Like something in Python save.plt().
I have noticed the function savePlot can save the figures but I cannot load it in RStudio, since it reports the errors in loading X11().
This leads me to think about another question... What is your way to using R or what is the proper way to using R? As a beginner I found RStudio is super easy to use and I like the idea that saving all the environments into a single file. But apparently it is no need to using X11() in plotting...
If you want to save from code the plot that is displayed in the RStudio plot tab then you have to call for example
rstudioapi::savePlotAsImage("test.png",width=300,height=150)
Plots can be saved as a jpg:
jpeg("Name_of_your_plot.jpg")
# your plot for example
plot(x,y)
dev.off()
Instead of jpg you can choose other image formats such as png, pdf or PostScript. The above code can be modified as:
png("Name_of_your_plot.png")
# your plot for example
plot(x,y)
dev.off()
If you have a ggplot you can use ggsave.

Is there a way to specify portrait/landscape orientation per page using pdf()?

I am trying to find a way to set the rotation per page. For example, this is the trimmed down code I am using:
pdf('test.pdf',
paper='USr', width=90, height=12, onefile=TRUE)
grid.draw(grobtable1)
grid.draw(ggplot1)
grid.newpage()
grid.draw(grobtable2)
grid.draw(ggplot2)
grid.newpage()
grid.draw(table.portrait)
dev.off()
I would like all the pages except for the last one to be portrait. Is there any elegant way to do this using pdf()?
I have no experience with R Markdown yet, as I have read that might be a way to do what I desire. However, the code that I gave is something I use as a function, of which the plots and tables are being called from another function output. Hence, I thought using R Markdown would require me to make new Markdown files all the time.
I'm not sure if you can alter the pdf orientation in the middle of a run. You could write out to two files and merge them together using the staplr package. See here.

R loop through complete script, find all plots generated and save them

I have the following problem using R and not found a solution so far:
I have a script where I run several operation and generate some plots. At the end, I would like to have a nice piece of code that automatically saves all the plots generated into the current working directory. So far, I am using:
trellis.device(device="png", filename="Plot_A.png")
print(Plot_A)
dev.off()
Which is working fine for just one specific plot. Now I am looking for some kind of for loop that takes all the plots and saves them with the name of the plot as a png file
In grid based plotting packages (lattice and ggplot), you can store the plot in an object and call print on them to trigger actual rendering of the plot. What you could do is not render the image on the spot, but append any plots to a list. Then, at the end, you can loop over the plots and output them.
plot_list = list()
lattice_plot = xyplot()
plot_list = append(plot_list, lattice_plot)
for(plot in plot_list) {
png('name.png')
print(plot)
dev.off()
}
Not exactly an answer but an alternative workflow.
If you are saving your plots in order to use it somewhere else, for example to include them in a Word document or in a presentation, you could just put your code in an RMarkdown document and knitr it to generate an html or doc document with all the output generated by the code, including plots. With RStudio all that could be done with a few clicks.
It may even be easier to take all plots from the Word document than from a folder of png files.

ggplot with ggplot2: pdf very slow to display

I am producing a pdf plot with this kind of command:
ggplot(df, aes(sample = x))+
stat_qq(geom="point",distribution=qexp)+
geom_abline(intercept = 0, slope = 1,linetype='dashed',col='red')
ggsave(file="xxx.pdf")
Than I want to integrate the pdf into a tex file and produce a final pdf document.
But, the ggplot is very slow to display and makes the pdf crash very often.
When I use geom='line' it doesn't happen so I guess it comes from the number of circle points.
Do you have any idea on how to solve this? I really prefer the geom='point' option.
PDFs are vector based - so every single point on your chart has to be loaded individually. This produces a 'load-up' sort of effect on your PDF. My solution would be to save as a high DPI png/gif instead:
ggsave(file="xxx.png", dpi=400) #default is 300 which is probably sufficent
Tex to pdflatex (or AN Other) will find the file 'xxx' if you not forced an extension in your R to Tex conversion as the include statement will usually not mention an extension. You will need to make sure that the pdf is deleted from the your charts folders to ensure it doesn't get picked up in preference to the png.

Easy way to copy paste base graph from R Studio into word document

I need to copy paste R graphs into MS Word.
rando<-rnorm(1:100)
plot(rando)
when I copy the .png graph from R Studio into Word I get a negative space version of the graph:
Is there a cleaner/easier way to do this? I would be happy to use pdf or something else to present the graph.
As #Roland suggested:
Export -> Copy Plot to Clipboard (window with plot will pop-out) -> Metafile -> Copy Plot -> Paste to MSWord.
This seems a lot of clicks to me, rather as #user2633645 suggested save all plots as png then insert them in MSWord in one go.
?png
rando<-rnorm(1:100)
png(filename = "rando.png")
plot(rando)
dev.off()
You can use the devEMF package. It is repeatable, easy to use, and converts very nicely to pdf if needed.
(wow is this an old question, but I guess it's still an issue. I'm on RStudio v1.3.1073)
I came across 3 options:
Cross posting from https://github.com/rstudio/rstudio/issues/5103#issuecomment-679021780: "I've found two simple workarounds: Paste Special and choose TIFF, or (my preference) drag the image from the zoom window and drop in PowerPoint"
Snipping tool
You can specify the dimensions like in the RStudio plot export
windows(800,600) ## Opens graphic window. ctrl c/v works here.
plot(rando)
If you are doing this copy-plot-to-Word often or for several plots, consider creating an .Rmd file with your code, call knitr on that file, and use system("pandoc to convert your knitted .md file to Word.

Resources