【问题标题】:Operating on SVG files with a large number of elements对包含大量元素的 SVG 文件进行操作
【发布时间】:2019-11-12 07:48:50
【问题描述】:

假设通过R 生成的SVG 文件表示一个包含大约160000 个数据点且文件大小超过20 MiB 的图形。具体来说,让我们假设这个 SVG 文件包含 160000 个 XML 圆圈定义。例如,请参阅this graph。因此,该文件对于科学项目来说并不是非典型的。

进一步假设您希望在 SVG 编辑器(例如 Inkscape)中对该文件进行后期处理。

我发现,在典型用户系统(x86_64 GNU/Linux,4 个 CPU,20 GiB RAM)上,几乎不可能通过典型的 SVG 编辑器对大于 20MiB 的 SVG 文件进行操作,因为文件几乎没有加载到墨水景观。

我想到了这个问题的几个潜在解决方案,每个都有一个严重的缺点:

  • 事先使用svgo 等工具优化SVG。虽然svgo 的应用确实将文件大小减少了大约 20%,但它也弄乱了图形本身(就像上面链接的示例文件所做的那样)。

  • 使用不同的文件格式,例如PDF。但是,Inkscape 等编辑器通常会将 PDF 转换回 SVG。

  • 通过 R 中的不同 SVG 渲染器保存图形。但是,基本命令 svg() 以及来自 R 包的具有相同名称的命令 svglite() 都会生成大小大致相同的图形。

有没有人建议如何打开和手动编辑此类包含大量 XML 元素的 SVG 文件?

【问题讨论】:

  • 使用 r 对输出进行预处理,以减少点数。
  • @RobertLongson 是的,你的建议被证明是唯一可行的解​​决方案。

标签: r xml svg inkscape


【解决方案1】:

您当然已经找到了一个很好的 SVG 渲染器压力测试:)

您的 SVG 包含看似完全不必要的剪辑路径,该路径应用于每个数据点。

如果我用一个组包围点并将剪辑路径应用于该组点,则渲染时间会显着减少。

  • 铬:255 秒 -> 58 秒
  • Firefox:188 秒 -> 14 秒

如果我完全删除该剪辑路径,我会得到:

  • 铬:27 秒
  • Firefox:10 秒。

不幸的是,这些更改对 Inkscape 中的渲染时间没有帮助,但希望它对您有所帮助。如果您需要比这更快的渲染时间,您可能需要按照 Robert 所说的那样做,并以某种方式减少数据点的数量。

【讨论】:

  • 我尝试了各种不同的矢量图形编辑器。然而,RobertLongson 在 cmets 中的建议(即减少总点数)被证明是唯一可行的解​​决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
相关资源
最近更新 更多