Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将SVG转换为ggPlot_R_Svg_Ggplot2 - Fatal编程技术网

R 将SVG转换为ggPlot

R 将SVG转换为ggPlot,r,svg,ggplot2,R,Svg,Ggplot2,我知道这很奇怪,但我希望能够在ggPlot中绘制Gartner炒作周期曲线,但这是一个奇怪的形状。我有一个SVG的路径,可以提取SVG坐标以下的线索 但是,在ggPlot中使用的绝对坐标数据框中,看不到任何方法可以转换这些坐标。这可能吗 有人能阐明一种可能的方法吗 提取的SVG路径是 “M12.967349.469c15.107-87.283,25.932-180.142,54.214-264.61c31.17-93.095,54.138,17.688,65.096,53.934c11.354,

我知道这很奇怪,但我希望能够在ggPlot中绘制Gartner炒作周期曲线,但这是一个奇怪的形状。我有一个SVG的路径,可以提取SVG坐标以下的线索

但是,在ggPlot中使用的绝对坐标数据框中,看不到任何方法可以转换这些坐标。这可能吗

有人能阐明一种可能的方法吗

提取的SVG路径是

“M12.967349.469c15.107-87.283,25.932-180.142,54.214-264.61c31.17-93.095,54.138,17.688,65.096,53.934c11.354,37.558,23.177,74.976,34.309112.6c26.534,89.679,79.275-25.286,92.183-45.57c11.749-18.462,20.938-43.699,69.798-48.28858-288.858-824.854”


我不知道有什么通用的解析器,我想我应该看看规范,看看它有多复杂。这里是将这些命令转换为点的粗略第一步。首先,辅助函数2计算二次贝塞尔曲线:

c_curve<-function(start, c1, c2, end, n=100) {
  c1 <- start+c1
  c2 <- start+c2
  end <- start+end
  sapply((0:n)/n, function(i) {
    q1 <- start+i*(c1-start)
    q2 <- c1+i*(c2-c1)
    q3 <- c2+i*(end-c2)
    r1 <- q1+i*(q2-q1)
    r2 <- q2+i*(q3-q2)
    r1+i*(r2-r1)
  })
}


我希望这是正确的形状?

您可以编写一点Javascript,使用
getPointAtLength()
提取曲线在直线上各个点的坐标。用法:然后使用结果shapefile查看grImport Wow的工作和功能。该情节实际上与Gartner的炒作周期相反,但形状正确。请参见(即Y轴的反方向)。简单修复位于plot语句plot中(pp[1,],350 pp[2,],type=“l”)
parse_svg_path <- function(path) {
  parts <- regmatches(path, gregexpr("[A-Za-z]|,|-?[0-9.]+", path, perl=T))[[1]] 
  parts <- parts[parts!=","]
  vals <- suppressWarnings(as.numeric(parts))
  i <- 1
  points <- matrix(ncol=0, nrow=2)
  while(i < length(parts)) {
    if (parts[i]=="M") {
      points <- cbind(points, c(vals[i+1], vals[i+2]))
      i <- i+3
    } else if (parts[i]=="c") {
      cpoints <- c_curve(
        points[, ncol(points)],
        c(vals[i+1], vals[i+2]),
        c(vals[i+3], vals[i+4]),
        c(vals[i+5], vals[i+6])
      )
      points <- cbind(points, cpoints)
      i <- i+7
    } else {
      stop(paste("unrecognized command", parts[i]))
    }
  }
  points
}
path <- "M12.967,349.469c15.107-87.283,25.932-180.142,54.214-264.61c31.17-93.095,54.138,17.688,65.096,53.934c11.354,37.558,23.177,74.976,34.309,112.6c26.534,89.679,79.275-25.286,92.183-45.57c11.749-18.462,20.938-43.699,69.798-48.289c70.298-6.604,177.054-4.848,224.858-5.774"
pp <- parse_svg_path(path)
plot(pp[1,], pp[2,], type="l")
# ggplot version:
# ggplot(data.frame(x=pp[1,], y=pp[2,])) + geom_path(aes(x,y))