【问题标题】:R & Inkscape: text labels in SVG graphics exported from R did not recognized as a text in InkscapeR & Inkscape:从 R 导出的 SVG 图形中的文本标签在 Inkscape 中未被识别为文本
【发布时间】:2013-08-17 23:52:23
【问题描述】:

我用代码在 R 中构建了树状图:

data(iris)

aver<-sapply(iris[,-5],function(x) by(x,iris$Species,mean))
matrix<-dist(aver)

clust<-hclust((matrix),"ave")
clust$labels<-row.names(aver)
plot(as.dendrogram(clust))

我想使用代码将树状图保存为 svg 文件:

install.packages("Cairo")
library(Cairo)

svg("plot.svg")
plot(as.dendrogram(clust))
dev.off()

问题从这里开始:

当我将“plot.svg”导入 Inkscape(版本:0.48.4)并选择任何标签(例如“setosa”)时,它不会被识别为文本,而是一些“用户定义的”对象。具体来说,当我在标签中选择任何“字母”并使用 Inkscape 中的 XML 编辑器 (ctrl+shift+X) 进行检查时,我获得了以下信息:

    **id**: use117

    **x**: 142.527344

    **xlink:href**: #glyph0-8

    **y**: 442.589844

另一方面,当我使用“创建和编辑文本对象”工具手动编写“setosa”并在 XML 编辑器中检查时,它返回:

    **id**: text4274

    **sodipodi:linespacing**: 125%

    **style**: font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Palatino Linotype;-inkscape-font-specification:Palatino Linotype

     **transform**: scale(0.8,0.8)

     **x**: 176.02016

     **xml:space**: preserve

     **y**: 596.96674

根据 XML 编辑器中的属性“id”,Inkscape 很可能没有将标签识别为文本。因此,我无法更改字体、大小以及使用与 Inkscape 中的文本对象相关的其他功能。

这是 svg file,我用之前的代码制作并导入到 Inkscape 中

我使用其他版本的 Inkscape 和 R 检查了之前的步骤,但结果是一样的。

问题来了:

在将 svg 文件从 R 导入 Inkscape 时,您有什么建议我可以将标签作为文本属性而不是“用户定义”(或任何对象......)收集吗?

更新

@baptiste 链接到 SO thread,其中 @Oscar Perpiñán 建议使用三个操作 SVG 的包(gridSVG、SVGAnnotation 和 RSVGTipsDevice)。不幸的是,建议的软件包都不能解决文本问题。 到目前为止,我找到了SO thread,其中 @Mo Sander 建议使用 RSvgDevice 包,因为它可以保留文本对象而不是字形。被 RSvgDevice 安装过程卡住了,我发现它 RSvgDevice 仅适用于 32 位安装并且 R

Warning message:
package ‘RSvgDevice’ is not available (for R version 3.0.1) 

除了旧 R 版本的要求外,目前只有 RSvgDevice 可以在 SVG 中保存文本对象。

【问题讨论】:

  • 您尝试过 R 中提供的所有不同的 svg 设备吗? IIRC 其中一个对文本的处理方式与其他人不同,至少没有情节。
  • 不,您能推荐一些其他设备吗?对不起,我不知道什么是 IIRC?
  • @baptiste 我尝试了建议的软件包,但不幸的是没有成功。

标签: r text graph svg inkscape


【解决方案1】:

我参加聚会有点晚了,但我自己一直在处理这个问题。我找到了一个让它工作的技巧。首先,我将绘图导出为 PDF 而不是 SVG,因为 inkscape 可以识别 PDF 字体。

然而,这带来了一个新问题,因为文本通常以逐个字母定义的方式结束,这意味着您可以更改字体,但间距仍然是定义的,并且变得非常烦人。我发现这是由于每个字母都定义了 x 坐标。

我写了一个 perl 脚本并把它放在in this gist 以删除所有尾随坐标。之后,我可以操纵我想要的所有字体。请注意,这仅适用于水平文本。

希望对您一年多前遇到的这个问题有所帮助 :)

【讨论】:

  • 返回并针对垂直和倾斜文本进行了测试。似乎它也适用于这些。
【解决方案2】:

这是开罗的失败。少校,在我看来。

cairo SVG 表面(即开罗用于在 SVG 上“绘制”的后端)根本不支持“文本”标签。它根本不了解字符串。相反,它单独放置每个字符(字形)。因此,如果您想使用矢量编辑器对包含的文本进行后期处理,则使用 Cairo 生成的任何 SVG 都没有用。 :(

我在 cairo 列表中找到的唯一提及是这个:

http://lists.cairographics.org/archives/cairo/2011-February/021777.html

【讨论】:

    【解决方案3】:

    R 显然没有使用标准的 SVG 文本对象来生成它的标签。我不知道为什么。我不是 R 用户。

    也许默认情况下它使用自己的自定义字体,它手动将字形逐个字形插入到输出中。您在两种情况下都使用相同的字体吗?在 Inkscape 中,您使用的是 Palatino。这就是你在 R 中使用的标签吗?

    【讨论】:

    • Tnx 回复@BigBadaboom。使用相同的字体 per se 并不重要,而是确保 Inkscape 安装了与 R 输出匹配的字体系列和类型。考虑到这个问题,根据support.rstudio.org 论坛帖子,Rstudio(我正在使用)具有默认字体 Lucida Console。 Inkscape 也有这种字体。 Palatino 只是一个示例,目的是展示 Inkscape 如何将文本对象与 R 图中的“用户定义”对象进行比较。
    • 以下是人们将 Inkscape 中 R 图形中的文本作为文本对象处理的一些示例:12 但是,当我尝试使用我的数据或上面发布的示例时,我无法在 Inkscape 中处理 R“文本”对象。
    • 我一直在猜测可能发生的事情。您能否使用导致问题的示例 SVG 文件更新您的问题?
    • @BigBadaboom tnx 的建议。我在 qestion 中添加了 svg 示例 (plot.svg) 的 link。请注意,svg 文件中使用的字体是“Sans”,即使 Rstudio 的默认字体是“Lucida Console”。
    • 出于某种原因,R 将每个字符字形包含为 SVG &lt;symbol&gt; 元素。换句话说,它将每个字母视为普通的旧图形形状。我不知道他们为什么做出这样的选择。没有明显的原因。您可能必须直接向 R 人员询问答案。无论如何,结果是您无法在 Inkscape 或任何其他 SVG 编辑器中编辑文本。您唯一的选择是自己手动替换文本。对不起。
    【解决方案4】:

    svglite 包根据需要在 Linux 上导出文本。

    [EDIT] 根据这个thread,还有一种方法可以去除将编辑后的文本挤压到固定框宽度中。只需从 XML 编辑器中的对象中删除 textLength 字段即可。

    干杯

    【讨论】:

      猜你喜欢
      • 2018-10-22
      • 2021-10-09
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      相关资源
      最近更新 更多