编织时在svg中控制曲面ID

时间:2018-12-05 14:40:09

标签: r svg knitr

我创建了一个带有svg数字的编织文档,以跟踪从提交到提交的任何视觉变化。我遇到的主要问题是,更改图表的顺序会更改.svg文件的ID。

例如,考虑以下编织:

\documentclass{article}

\begin{document}

<<knitropts>>=
library(knitr)
library(ggplot2)
opts_chunk$set(fig.path = "svg-differ/",
               dev = c("svg", "pdf"),
               fig.ext = c("svg", "pdf"))
set.seed(1)
@

<<chart>>=
set.seed(1)
x <- seq(0, 1, length.out = 1000)
y <- -2 * sin(10 * x) + 3 * x^2 - 2 * x
qplot(x, y, geom = "smooth")
@

<<chart-2>>=
x <- sample(seq(0, 1, length.out = 1000))
y <- -2 * sin(10 * x) + 3 * x^2 - 2 * x
qplot(x, y, geom = "smooth")
@

\end{document}

如果我切换chartchart-2块的顺序,则.svg文件是相同的,除了一行:

<g id="surface1"><g id="surface6">

是否有一种方法可以使svg文件创建为(完全)相同,直到重新排序块?我知道,如果要在同一个HTML文件中包含多个svg,则这些ID的顺序排序很重要,但是就我的目的而言,这并不重要。

1 个答案:

答案 0 :(得分:1)

我认为在R的svg()驱动程序中将id设置为相当低的水平,并且没有明显的方法来对其进行更改。但是,您可以在使用图钩生成图形之后进行更改。例如,将其放在文档的knitr选项块中:

<<knitropts>>=
library(knitr)
library(ggplot2)
opts_chunk$set(fig.path = "svg-differ/",
               dev = c("svg", "pdf"),
               fig.ext = c("svg", "pdf"))
set.seed(1)
oldhook <- knitr::knit_hooks$get("plot")
newhook <- function(x, options) {
  lines <- readLines(x)
  lines <- sub('<g id="surface[[:digit:]]+">',
      '<g id="surface">', lines)
  writeLines(lines, x)
  oldhook(x, options)
}
knitr::knit_hooks$set(plot = newhook)
@

这会将图输出文件中的所有字符串,例如<g id="surface##">更改为<g id="surface">。您可能需要使其更加复杂。例如,它仅应尝试对svg文件进行处理,并且可能使用其他ID会更好。