代码之家  ›  专栏  ›  技术社区  ›  Hugh

编织时svg中的曲面id控制

  •  0
  • Hugh  · 技术社区  · 5 年前

    我创建了一个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}
    

    如果我改变了 chart chart-2 块,.svg文件除了一行之外是相同的:

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

    有办法使 静止无功发生器 这样创建的文件在重排序块之前(完全)是相同的?我知道,如果要在同一个html文件中包含多个svg,这些id的顺序顺序很重要,但对于我来说,这并不重要。

    1 回复  |  直到 5 年前
        1
  •  1
  •   user2554330    5 年前

    我认为在 svg() 司机在R,没有明显的方法改变它。但是,可以在使用plot hook生成图形后更改它。例如,将它放在文档的knitr options块中:

    <<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可能更好。