r - 如何在网格中排列 html 小部件图以导出为 pdf?

标签 r gridextra htmlwidgets networkd3

我想结合丰富的 html 小部件(主要是plotly 和 networkD3),以及将它们排列为 R 网格中的绘图的可能性,将它们导出为出版物的 pdf 图形。但是,如果我在 R 中创建一些 html 小部件对象并尝试使用 gridExtra::grid.arrange() 排列它们(请参见下面的最小示例),我会收到以下错误:

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

我搜索了“将 html 小部件转换为 grobs 或图”以便能够将它们排列在网格中,但找不到任何相关信息。我可以采用冗长的手动方式,首先使用 htmlwidgets::saveWidget() 将 html 小部件保存为网站,然后使用 webshot::webshot() 将其转换为 pdf > 并使用矢量图形编辑器(例如 Inkscape)手动排列图形。但尽管需要手动操作,所有转换步骤都可能会导致质量下降。

也许我可以用表格或列来排列 LaTeX R-Markdown 文档中的图形,并指定纸张尺寸以适合我的绘图。但不知怎的,这感觉不像是一个理想的解决方案,因为我可能想将我的图表动态地排列在多个列和行中,添加标题等,这将使 LaTeX/knitr 中的排列变得相当复杂。

因此,在我开始手动将所有内容编织在一起之前,我想问一下您是否知道更好的方法来排列一些 html 小部件图并将它们导出到 R 中的 pdf 中?

<小时/>

最小示例

这是一个重现我的问题的小例子。假设我的目标是一个图表,通过将两个不同过程的能量流排列在网格中,相互比较两个不同过程的能量流(带有 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、grid 3.2.3、gridExtra 2.2.1、networkD3 0.2.13

最佳答案

受到 Amit Kohli 的启发,我开始尝试使用 flexdashboard、各种 Rmarkdown 格式(html、pdf、isolides...)、Rpresentations - 但与我的目标相比,它们都有一些缺点。

在我看来,最好的视觉效果可以通过 Shiny 应用程序来实现。然后使用 chrome 将生成的网站保存为 pdf,最后使用 briss 裁剪 pdf .

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)

编写一个 Shiny 的应用程序并进行所有这些手动转换只是为了在 pdf 中排列两个 html 小部件图形,仍然感觉有点矫枉过正,但至少生成的 pdf 图片看起来非常令人愉悦。

我希望这对其他人也有帮助。

关于r - 如何在网格中排列 html 小部件图以导出为 pdf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40089207/

相关文章:

r - R中具有多个条件的左连接

r - 如何为tableGrob图添加标题?

r - vtree 对象在 Markdown 中呈现,但不在四开本中呈现

r - 如何使用 R 中的 rcv 和 networkD3 包在 D3 Sankey 图的节点中添加图像?

r - 在 R 中为 plotly 图例添加标题

r - 如何绘制以相同均值为中心的二项式 PDF 分布

r - 根据组计算存在/缺席情况

r - R 版本 3.2.2 下 arrangeGrob 的问题

r - gridExtra 2.0.0 更改标题大小

javascript - 你如何在 Shiny 的 htmlwidget (jsoneditor) 上调用 javascript 方法?