Контроль поверхности ID в SVG при вязании - PullRequest
0 голосов
/ 05 декабря 2018

Я создал документ knitr с цифрами svg, чтобы отслеживать любые визуальные изменения от фиксации к фиксации.Основная проблема, с которой я сталкиваюсь, заключается в том, что изменение порядка диаграмм приводит к изменению идентификаторов файлов .svg.

Например, рассмотрим следующее переплетение:

\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}

Если я переключу порядок чанков chart и chart-2, файлы .svg будут идентичны, за исключением одной строки:

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

Есть ли способ сделать файлы svg, созданные таким образом, чтобы они были (полностью) идентичны переупорядочению фрагментов?Я понимаю, что последовательный порядок этих идентификаторов важен, если несколько SVG должны быть включены в один и тот же HTML-файл, но для моей цели это не важно.

1 Ответ

0 голосов
/ 09 декабря 2018

Я думаю, что идентификатор установлен на довольно низком уровне в драйвере svg() в R, и нет очевидного способа изменить его.Тем не менее, вы можете изменить его после создания фигуры, используя сюжетный крюк.Например, поместите это в ваш блок параметров 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-файлами, и может быть, что какой-то другой идентификатор будет лучше.

...