gpt4 book ai didi

读取 SVG 路径/多边形的坐标

转载 作者:行者123 更新时间:2023-12-04 09:30:09 28 4
gpt4 key购买 nike

我正在尝试将使用 illustrator 创建的 SVG 文件中的路径坐标导入 R。
我想我可以用 grImport2 将 SVG 读入 R ,理论上应该导入 SVG 文件,但我认为它们可能只处理由开罗设备生成的 SVG 文件。
假设我想导入以下 .svg 文件:

这是我加载 SVG 文件的尝试。如果我正确阅读了内容,它应该只包含 1 个(复杂的)路径。该警告与我在加载由 Adob​​e Illustrator 创建的 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至少 xy ( anchor )点的坐标以及一些可以区分不同路径的元数据。我不需要插入的曲线和弧线或类似的东西。
有没有我不知道的其他包可能会导入这个?有没有办法将SVG转换为我可以读入R的SVG?

最佳答案

好问题 Teunbrand - 感谢您的发布。问题似乎正在变得grImport2阅读非开罗 svg。所以实际上,我们只需要另一个翻译步骤:使用包rsvg读入非开罗 svg 并用开罗写同样的东西。奇怪的是,它有一个函数来做到这一点,叫做 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)
enter image description here
我之前从未见过在网格中绘制的任意 SVG,所以我很高兴找到这个,这是由您的问题提示的。再次感谢。

关于读取 SVG 路径/多边形的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62882121/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com