我正在使用 RMarkdown 和 knit 生成 HTML 文档。我之前使用此 yaml 和块选项将所有
ggplot2
图形设置为渲染为 SVG:
output:
html_document:
self_contained: yes
knitr::opts_chunk$set(dev = 'svglite', fig.ext = 'svg')
这曾经工作得很好,我可以右键单击图形将它们另存为 SVG。然而,最近,这些图形似乎被渲染为 HTML 而不是 SVG,现在我无法再右键单击它们进行保存,而且图形中的文本是可选的。此外,某些数字未正确渲染,例如某些误差线超出了绘图边缘。
我发现当我设置
self_contained: no
时,SVG 会正确渲染,但仍然能够使用 self_contained: yes
对我来说至关重要。
此外,我注意到,以前,SVG 被渲染为
<img>
元素,其中 src
属性指向 SVG 文件的 base64 编码版本。但是,现在使用 <svg>
标签直接嵌入图形,这改变了浏览器处理它们的方式,使 SVG 成为 HTML 结构的一部分,而不是单独的图像文件。
此问题似乎与 Pandoc (2.19+) 中的 最近更新有关。
如何恢复到以前的行为,将图形另存为可以右键单击并保存的独立 SVG 文件?
内联 SVG 在
Pandoc 3.1.6中替换了 SVG 图像的
data
URI,在 3.2.1 中,他们引入了 inline-svg
类来控制此行为,并默认返回到 data
URI。当前的 RStudio(2024.09 和 2024.11 dailies)仍然捆绑 Pandoc 3.2,但您可能只需手动替换 pandoc 二进制文件。
或者也许通过
pandoc
包安装并使用 3.2.1,如 https://bookdown.org/yihui/rmarkdown-cookbook/install-pandoc.html : 中所述
pandoc::pandoc_install("3.2.1")
pandoc::with_pandoc_version(
version = '3.2.1',
rmarkdown::render('rmd_svglite.Rmd')
)
img
在结果文档中:
<img role="img" src="data:image/svg+xml;base64,PD94...==" width="672">
rmd_svglite.Rmd供参考:
---
output:
html_document:
self_contained: yes
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, dev = 'svglite', fig.ext = 'svg')
library(ggplot2)
```
```{r pressure, echo=FALSE}
pressure |>
ggplot(aes(temperature, pressure)) +
geom_point()
```