2016-10-17 37 views
3

Я хотел бы объединить богатство html-виджетов (в основном, plotly и networkD3), с возможностью размещения их в виде графиков в сетке в R, чтобы экспортировать их в формате pdf для публикации. Тем не менее, если я создаю некоторые объекты HTML виджета в R и попытаться организовать их gridExtra :: grid.arrange() (см минимальный пример ниже), я получаю следующее сообщение об ошибке:Как разместить графические элементы html в сетке для экспорта в формате pdf?

Error in gList(list(x = list(links = list(source = c(0, 0), target = c(1, : 
only 'grobs' allowed in "gList" 

я искал « преобразование html-виджетов в грызуны или сюжеты », чтобы иметь возможность размещать их в сетке, но не смог найти никакой соответствующей информации. Я мог бы пойти длинный ручной способ сначала сохранить html-виджет как сайт с htmlwidgets :: saveWidget(), а затем преобразовать его в pdf с webshot :: webshot() и организовать графику вручную с помощью векторной графики редактора (например, Inkscape). Но, несмотря на ручное усилие, все этапы преобразования могут привести к снижению качества.

Возможно, я мог бы как-то упорядочить графику в документе LaTeX R-Markdown с помощью таблиц или столбцов и указать размер бумаги в соответствии с моим графиком. Но почему-то это не похоже на идеальное решение, так как я могу динамически упорядочивать свои графики в нескольких столбцах и строках, добавлять заголовки и т. Д., Что сделало бы схему довольно сложной в LaTeX/knitr.

Итак, прежде чем я отправимся в путешествие по вязанию всего вручную, я хотел бы спросить, знаете ли вы, как лучше расположить графики html-виджетов и экспортировать их в pdf внутри R?


Пример минимального

Вот немного минимальный пример, чтобы воспроизвести мою проблему. Скажем, моя цель представляет собой график, который сравнивает поток энергии двух различных процессов друг с другом (Санки диаграммы с networkD3), располагая их рядом друг с другом в сетке, например, так: Exemplary arranged Sankey plots

Это будет мой код:

library(networkD3) 
library(grid) 
library(gridExtra) 

## Create simplified Data 
dfSankey <- list() 
dfSankey$nodes <- data.frame(Name = c("Final Energy","Conversion Losses","Useful Energy")) 
#1st process 
dfSankey$links1 <- data.frame(Source = c(0,0),Target=c(1,2),Value=c(30,70)) 
#2nd process 
dfSankey$links2 <- data.frame(Source = c(0,0),Target=c(1,2),Value=c(10,60)) 

## Draw Sankeys 
plSankey1 <- sankeyNetwork(Links = dfSankey$links1, Nodes = dfSankey$nodes, Source = 'Source', 
          Target = 'Target', Value = 'Value', NodeID = 'Name') 
plSankey2 <- sankeyNetwork(Links = dfSankey$links2, Nodes = dfSankey$nodes, Source = 'Source', 
          Target = 'Target', Value = 'Value', NodeID = 'Name') 

#Arrange them next to each other 
grid.arrange(plSankey1,plSankey2) 

В результате появляется сообщение об ошибке, упомянутое в начале.


Windows 7, R-Studio 0.99.903, R версия 3.2.3, сетка 3.2.3, gridExtra 2.2.1, 0.2.13 networkD3

+0

http://www.rmarkdown.rstudio.com/flexdashboard/ Добро пожаловать –

+1

[http://rmarkdown.rstudio.com/flexdashboard/](http://rmarkdown.rstudio.com/flexdashboard/) Отлично, но без www. before («Страница не найдена») – Nino

+0

И затем для экспорта в PDF Мне нужно использовать * webshot :: webshot() * Я предполагаю? – Nino

ответ

1

После вдохновению Amit Коли I начал экспериментировать с flexdashboard, всеми форматами Rmarkdown (html, pdf, isolides, ...), Rpresentations - но все они имели некоторые недостатки по сравнению с моей целью.

На мой взгляд, лучшие визуальные результаты могут быть достигнуты с помощью блестящего приложения. Затем сохраните полученный веб-сайт в формате pdf с chrome и, наконец, выталкивая pdf с помощью briss.

library(networkD3) 

## Create simplified Data 
dfSankey <- list() 
dfSankey$nodes <- data.frame(Name = c("Final Energy","Conversion Losses","Useful Energy")) 
#1st process 
dfSankey$links1 <- data.frame(Source = c(0,0),Target=c(1,2),Value=c(30,70)) 
#2nd process 
dfSankey$links2 <- data.frame(Source = c(0,0),Target=c(1,2),Value=c(10,60)) 

# Define UI for application that draws two Sankeys in columns 
ui <- shinyUI(fluidPage(column(6, 
           h2("Process 1", align = "center"), 
           uiOutput("plot1.ui") 
           ), 
         column(6, 
           h2("Process 2", align = "center"), 
           uiOutput("plot2.ui") 
           ) 
)) 

# Define server logic required to draw the sankeys 
server <- shinyServer(function(input, output) { 

    #Render plot area relative to flow height 
    output$plot1.ui <- renderUI({ 
     sankeyNetworkOutput("Plot1", height = "400px") 
    }) 
    output$plot2.ui <- renderUI({ 
     sankeyNetworkOutput("Plot2", height=paste0(400*(70/100),"px")) 
    }) 

    #Render Sankeys 
    output$Plot1 <- renderSankeyNetwork({ 
    sankeyNetwork(Links = dfSankey$links1, Nodes = dfSankey$nodes, Source = 'Source', 
        Target = 'Target', Value = 'Value', NodeID = 'Name', fontSize = 15, nodeWidth = 10) 
    }) 

    output$Plot2 <- renderSankeyNetwork({ 
    sankeyNetwork(Links = dfSankey$links2, Nodes = dfSankey$nodes, Source = 'Source', 
        Target = 'Target', Value = 'Value', NodeID = 'Name', fontSize = 15, nodeWidth = 10) 
    }) 
}) 

# Run the application 
shinyApp(ui = ui, server = server) 

Тем не менее чувствует себя немного как массовое убийство, чтобы написать блестящее приложение и делать все это руководство конвертирования только для размещения два фигур HTML виджета в формате PDF, но, по крайней мере, в результате PDF картина выглядит очень приятно.

Я надеюсь, что это тоже поможет другим.

 Смежные вопросы

  • Нет связанных вопросов^_^