我用代码在 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 中保存文本对象。