R&Inkscape:从R导出的SVG图形中的文本标签在Inkscape中未被识别为文本

New*_*e_R 9 svg text r graph inkscape

我用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))
Run Code Online (Sandbox Code Playgroud)

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

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

svg("plot.svg")
plot(as.dendrogram(clust))
dev.off()
Run Code Online (Sandbox Code Playgroud)

问题出现了:

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

    **id**: use117

    **x**: 142.527344

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

    **y**: 442.589844
Run Code Online (Sandbox Code Playgroud)

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

    **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
Run Code Online (Sandbox Code Playgroud)

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

这是svg文件,我用前面的代码制作并导入到Inkscape中

我使用其他版本的Inkscape以及R检查了之前的步骤,但它会是相同的.

这是一个问题:

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

UPDATE

@baptiste链接到SO线程,其中@OscarPerpiñán建议操作SVG的三个包(gridSVG,SVGAnnotation和RSVGTipsDevice).不幸的是,所提出的软件包都没有解决文本问题.到目前为止,我找到了SO线程,其中@Mo Sander建议RSvgDevice包,因为它可以保留文本对象而不是字形.由于坚持使用RSvgDevice安装程序,我发现RSvgDevice仅适用于32位安装且R <2.15.0.否则,R返回警告消息:

Warning message:
package ‘RSvgDevice’ is not available (for R version 3.0.1) 
Run Code Online (Sandbox Code Playgroud)

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

ZNK*_*ZNK 5

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

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

我写了一个perl脚本并将其放在这个要点中以删除所有尾随坐标.之后,我能够操纵我希望的所有字体.请注意,这仅适用于水平文本.

希望能帮到你一年多前遇到的这个问题:)


Pau*_*eau 0

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

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

  • 由于某种原因,R 将每个字符字形包含为 SVG `&lt;symbol&gt;` 元素。换句话说,它将每个字母视为一个普通的旧图形形状。我不知道他们为什么做出这样的选择。没有明显的原因。您可能需要直接向 R 人员询问答案。无论如何,结果是您无法在 Inkscape 或任何其他 SVG 编辑器中编辑文本。您唯一的选择是自己手动替换文本。对不起。 (2认同)