【发布时间】:2016-10-17 14:35:34
【问题描述】:
我想将丰富的 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
【问题讨论】:
-
http://rmarkdown.rstudio.com/flexdashboard/ 完美,但没有 www。之前(“找不到页面”)
-
然后要导出为 PDF 我必须使用 webshot::webshot() 我猜?
-
rmarkdown::render("mydoc.Rmd", output_format = "pdf_document") -
再次感谢@AmitKohli Flexdashboard 就像 html 输出的魅力。但是,如果我将文档呈现为 PDF,它不会考虑任何列,而是将每一列打印在额外的页面上。不幸的是,webshot 以及直接从 chrome 打印 PDF 都会导致一个很大的空文件(请参阅this thread)
标签: r gridextra htmlwidgets networkd3