Добавьте htmlwidget из R в слайд PowerPoint

Как добавить вывод диаграммы htmlwidget из DiagrammeR::grViz() на слайд PowerPoint? Я бы предпочел сохранить векторную графику и свести к минимуму ручные прикосновения.

Код в main.R ниже прекрасно отображает диаграмму DOT как htmlwidget

# ./code/digraph-test.dot 
digraph my_plot_name {
A->B->C;
}

# main.R
library(DiagrammeR)
digraph_test <- grViz("./code/digraph-test.dot")

Я хочу добавить этот вывод на слайд PowerPoint. Я адаптировал следующий код из этот пост.

library( ReporteRs )
require( ggplot2 )
mydoc = pptx( )
mydoc = addSlide( mydoc, slide.layout = "Title and Content" )
mydoc = addTitle( mydoc, "Plot examples" )
myplot = grViz("./code/digraph-test.dot")
# myplot = qplot(Sepal.Length, Petal.Length
#                , data = iris, color = Species
#                , size = Petal.Width, alpha = I(0.7))
mydoc = addPlot( mydoc, function( ) print( myplot ), vector.graphic=TRUE)
writeDoc( mydoc, file = "test plot.pptx" )

Выдает следующую ошибку:

Error in .jcall(slide, "I", "add", dml.object) : 
  javax.xml.bind.UnmarshalException
 - with linked exception:
[org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 2; The markup in the document preceding the root element must be well-formed.]

Кажется, некоторым людям удалось успешно использовать надстройку LiveWeb для PowerPoint. Я столкнулся с проблемой ActiveX, нашел только хакерские решения и решил не продолжать. Должно быть простое решение, не так ли?


person lowndrul    schedule 20.03.2017    source источник
comment
Почему бы не использовать формат слайдов RMarkdown?   -  person alistaire    schedule 20.03.2017
comment
@alistaire Хотел бы я. К сожалению, мне нужно добавить слайды PowerPoint в гораздо более длинную презентацию PowerPoint.   -  person lowndrul    schedule 20.03.2017


Ответы (1)


как предложил @alistaire, Rmarkdown был бы лучшим решением для этого графика, но если вам это нужно в PowerPoint, я предлагаю использовать пакет webshot, чтобы получить его в виде файла png.

library(DiagrammeR)
library( ReporteRs )

mydoc = pptx()
mydoc = addSlide( mydoc, slide.layout = "Title and Content" )
mydoc = addTitle( mydoc, "Plot examples" )

# compute new size for image to fit in ppt shape ----
shape_dim <- dim(mydoc)$size
shape_height <- setNames( shape_dim["height"], NULL ) * 72 
shape_width <- setNames( shape_dim["width"], NULL ) * 72

# reuse the shape dimensions in grViz call ----
digraph_test <- grViz("digraph-test.dot", width = shape_width, height = shape_height )
htmlwidgets::saveWidget(widget = digraph_test, file = "digraph.html", selfcontained = TRUE)
webshot::webshot(url = "digraph.html", selector = '.html-widget-static-bound', file= "digraph.png")


mydoc = addImage( mydoc, filename = "digraph.png" )
writeDoc( mydoc, file = "test plot.pptx" )
person David Gohel    schedule 20.03.2017
comment
Дэвид, почему ты выбрал 500x300? Я попытался адаптировать ваш код, чтобы диаграмма заполнила полный слайд PowerPoint (с использованием пользовательского шаблона макета слайда с полным содержимым страницы). Я обнаружил, что разрешение 960x540 идеально подходит для этого слайда. Но получившаяся диаграмма была не по центру. Есть идеи, что случилось? - person lowndrul; 20.03.2017
comment
Я обновил пример, чтобы он адаптировался к размеру формы ppt - я думаю, что лучше контролировать размер. - person David Gohel; 20.03.2017
comment
Это отлично сработало для меня (я адаптировал ваш код для заполнения полного слайда PowerPoint на основе этот пост). Пункт был идеально отцентрирован. Супер полезно! - person lowndrul; 20.03.2017
comment
Спасибо за это, Дэвид. Я знаю, что это, вероятно, очень неосведомленно обо мне, но ...! Если бы я хотел использовать ваш замечательный ggiraph для создания интерактивного ggplot с всплывающими окнами, есть ли способ перенести этот интерактив в PowerPoint, сохранив при этом интерактивность? (Я пробовал вышеописанное, но всплывающие окна не открывались.) Еще раз извините, если это невежественно, и искреннее спасибо за ggiraph. - person p0bs; 04.04.2017
comment
Кстати, если вы хотите, чтобы я добавил это как отдельный вопрос, скажите об этом - person p0bs; 04.04.2017
comment
@ p0bs нет, для этого потребуется надстройка MS (насколько мне известно) - person David Gohel; 06.04.2017
comment
ОК - высоко ценится - person p0bs; 06.04.2017