我试图将用插画师创建的SVG文件中的路径坐标导入到R中。
我想我可以用grImport2将SVG读入R中,理论上这应该是导入SVG文件,但我认为它们可能只处理由Cairo设备生成的SVG文件。
假设我想导入以下.svg文件:
这里是我加载SVG文件的尝试。如果我正确地阅读了内容,它应该只包含一个(复杂的)路径。此警告与加载创建的SVG文件时得到的警告相同。请注意,下面的代码将被卡住一段时间!
file <- "https://upload.wikimedia.org/wikipedia/commons/d/db/Brain_Drawing.svg"
download.file(file, tmp <- tempfile(fileext = ".svg"))
# Don't run the following line, it will get your R session stuck!
x <- grImport2::readPicture(tmp)
#> Warning message:
#> In checkValidSVG(doc, warn = warn) :
#> This picture was not generated by Cairo graphics; errors may result
unlink(tmp)我理想的输出将是一个data.frame,它至少包含(锚)点的x和y坐标,以及一些可以区分不同路径的元数据。我不需要曲线和弧线插值之类的。
还有其他我不知道的包可能会导入这个程序吗?有没有办法把SVG转换成我能读到的R?
发布于 2020-07-13 21:15:05
不错的问题青少年品牌-谢谢你的帖子。问题似乎是让grImport2阅读非开罗svg。因此,实际上,我们只需要另一个翻译步骤:使用包rsvg在非开罗svg中读取,并使用Cairo编写相同的内容。奇怪的是,它有一个函数来完成这个任务,称为rsvg_svg。因此,我们可以在一行中以Picture对象的形式读取远程文件,甚至无需创建本地tmp文件:
file <- "https://upload.wikimedia.org/wikipedia/commons/d/db/Brain_Drawing.svg"
svg <- grImport2::readPicture(rawToChar(rsvg::rsvg_svg(file)))不幸的是,Picture是一个深列的S4对象,它比grob树更难导航。我相信像你这样有能力的人可以强迫它进入一个数据框架,但这并不简单,我不会在这里尝试。至少这些组件本身看起来很容易收获:
svg@content[[1]]@content[[1]]@d@segments[[3]]
#> An object of class "PathCurveTo"
#> Slot "x":
#> [1] 791.8359 789.5286 787.1382 784.6293 782.0041 779.2962 776.5600 773.8555 771.2318
#> [10] 768.712 766.2875 764.8359
#>
#> Slot "y":
#> [1] 8.191406 8.209760 8.239691 8.282891 8.340521 8.412835 8.499026 8.597442 8.706126
#> [10] 8.82357 8.949580 9.031250无论如何,有一些很好的实用程序函数可以让您做一些很酷的事情,比如:
brainGrob <- grImport2::pictureGrob(svg)
ggplot2::ggplot() + ggplot2::geom_point(ggplot2::aes(1, 1))
grid::grid.draw(brainGrob)

我以前从未见过在网格中绘制任意SVG,因此我很高兴地发现,这是由您的问题提示的。再次感谢。
https://stackoverflow.com/questions/62882121
复制相似问题