2015-07-03 7 views
17

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

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), и что мне не нравится вручную указывать смещения и размер (I usua lly предпочитают просто получать почти заполнение страницы, центрированный график на моем слайде). Мне просто интересно, если бы вместо этого было невозможно сделать ваш сюжет первым (базовый график R, участок lattice или участок ggplot2), а затем определить функцию export2PPT, которая фиксирует вывод вашего текущего графического устройства как функцию и передает его на до ReporteRs и addPlot для экспорта вашего участка в качестве Powerpoint (по центру & соответственно масштабируется), по аналогии с функцией dev.copy2pdf, которая работает так же, как экспортировать в PDF?

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

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

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

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

EDIT2: Теперь я сделал [small package export] с вспомогательными функциями graph2ppt и graph2doc экспортировать текущий активный график в Powerpoint или слово а также 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") 

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

+0

Для редактирования в Inkscape, я обычно экспорт в .SVG. Что касается второй части вашего вопроса, вы говорите о RGui, RStudio или о чем-то еще? –

+0

Спасибо, что указали на это - у меня создалось впечатление, что .svg не поддерживает прозрачные/альфа-каналы, но, видимо, теперь это происходит ... Определенно замеченные случаи, когда svg-экспорт также иногда прикручивается, хотя ... И все же предпочитаю редактирование в Powerpoint, особенно для простых вещей. Вторая часть моего вопроса заключалась в том, как можно реализовать файл ...Сохранить как вкладку Powerpoint, используя приведенную ниже функцию, либо на вкладке графика RStudio, либо в интерактивном окне, которое вы получаете при использовании окон(), а затем создаете свой сюжет в этом окне (под Windows) –

+0

Во-вторых, предложение о том, что «экспорт в Powerpoint "или простая в использовании функция. Я знаю многих людей, которые больше знакомы с Powerpoint, чем Illustrator, Inkscape и т. Д. (И кто предпочитает делать все точные настройки в программном обеспечении, управляемом мышью), и я уверен, что эта функция будет пользоваться большим количеством использования. – lukeholman

ответ

26

Только что нашел следующее удобное решение, позволяющее экспортировать 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 участка:

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

, который после нажатия правой кнопки мыши в РРТ на "разгруппировать" можно увидеть, что хорошо в векторном формате:

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 эти графики также отлично экспортируются в (векторный формат) PDF с помощью File ... Save as ... PDF, и намного легче сделать небольшие изменения в макете, чем это возможно, непосредственно редактируя PDF.

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

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

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