9

我用代码在 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 文件,我使用之前的代码制作并导入 Inkscape

我使用其他版本的 Inkscape 和 R 检查了之前的步骤,但它是相同的。

这是问题:

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

更新

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

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

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

4

4 回答 4

6

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

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

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

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

于 2014-11-02T00:52:12.293 回答
2

这是开罗的失败。少校,从我的角度来看。

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

我在开罗名单上发现的唯一提及是这个:

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

于 2013-10-16T17:16:55.457 回答
0

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

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

于 2013-08-16T03:38:32.000 回答
0

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

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

干杯

于 2020-06-25T13:16:45.050 回答