我想结合丰富的 html 小部件(主要是plotly和networkD3),以及将它们排列为R网格中的绘图的可能性,将它们导出为出版物的pdf图形。但是,如果我在 R 中创建一些 html 小部件对象并尝试使用gridExtra::grid.arrange()排列它们(请参见下面的最小示例),我会收到以下错误:
\n\nError in gList(list(x = list(links = list(source = c(0, 0), target = c(1, : \nonly \'grobs\' allowed in "gList"\n
Run Code Online (Sandbox Code Playgroud)\n\n我搜索了 \xe2\x80\x9cconverting html widgets to grobs 或plots\xe2\x80\x9d 以便能够将它们排列在网格中,但找不到任何相关信息。我可以采用漫长的手动方式,首先使用htmlwidgets::saveWidget()将 html 小部件保存为网站,然后使用webshot::webshot()将其转换为 pdf,并使用矢量图形编辑器手动排列图形(例如墨景)。但尽管需要手动操作,所有转换步骤都可能会导致质量下降。
\n\n也许我可以以某种方式用表格或列排列 LaTeX R-Markdown 文档中的图形,并指定纸张尺寸以适合我的绘图。但不知怎的,这感觉不像是一个理想的解决方案,因为我可能想将我的图表动态地排列在多个列和行中,添加标题等,这将使 LaTeX/knitr 中的排列变得相当复杂。
\n\n因此,在我开始手动将所有内容编织在一起之前,我想问您是否知道更好的方法来排列一些 html 小部件图并将它们导出到 R 中的 pdf 中?
\n\n最小的例子
\n\n这是一个重现我的问题的小例子。让\xe2\x80\x99s 说我的目标是一个图表,通过将两个不同过程的能量流相互比较(带有networkD3的桑基图),将它们排列在网格中,如下所示:\n示例性排列桑基图
\n\n这将是我的代码:
\n\nlibrary(networkD3)\nlibrary(grid)\nlibrary(gridExtra)\n\n## Create simplified Data\ndfSankey <- list()\ndfSankey$nodes <- data.frame(Name …
Run Code Online (Sandbox Code Playgroud) 当将简单的条形图编织为 pdf 时,我的条形图中出现了一些不需要的条纹(请参见所附屏幕截图的右侧)。
---
title: "Don't Panic"
author: "Ford Perfect"
output: pdf_document
---
```{r, include = F}
library(ggplot2)
```
# Introduction
```{r, echo = F, fig.cap = "My plot"}
ggplot(mpg) + geom_bar(aes(x = as.factor(cyl), y = hwy), stat="identity")
```
Run Code Online (Sandbox Code Playgroud)
当我直接在 R-Studio 中创建绘图时,这些条纹不会出现(请参见所附屏幕截图的左侧)。
我找到了一种通过聚合之前的数据来删除这些条纹的方法:
ggplot(aggregate(hwy~cyl,mpg,"sum")) +
geom_bar(aes(x = as.factor(cyl), y = hwy), stat="identity")
Run Code Online (Sandbox Code Playgroud)
所以我知道这些条纹应该来自堆叠数据集中的所有其他组。这个理论似乎是合理的,因为当我按年份聚合数据集时,我得到了两条条纹(mpg 数据集中有 2 个唯一值)。
ggplot(aggregate(hwy~cyl*year,mpg,"sum")) +
geom_bar(aes(x = as.factor(cyl), y = hwy), stat="identity")
Run Code Online (Sandbox Code Playgroud)
但我认为当我将stat设置为Identity时,ggplot2 会自动为我进行聚合?实际上它可以直接在 R-Studio 中运行。那么也许这个问题与knitr有更多关系?
我确实相信我过去没有遇到过同样的问题。那么也许更新后有些东西发生了变化?实际上我所有的同事(另外 6 台 mac 和 windows 电脑)都有完全相同的问题。
R …