小编New*_*e_R的帖子

R&Inkscape:从R导出的SVG图形中的文本标签在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中保留文本对象.

svg text r graph inkscape

9
推荐指数
2
解决办法
3604
查看次数

从n,k维的矩阵数组中减去n,k维的矩阵

如果我有阵列A.

A <- array(0, c(4, 3, 5))
for(i in 1:5) {
  set.seed(i)
  A[, , i] <- matrix(rnorm(12), 4, 3)
}
Run Code Online (Sandbox Code Playgroud)

如果我有矩阵B

set.seed(6)
B <- matrix(rnorm(12), 4, 3)
Run Code Online (Sandbox Code Playgroud)

从数组A的每个矩阵中减去B的代码是:

d<-array(0, c(4,3,5))
for(i in 1:5){
  d[,,i]<-A[,,i]-B
}
Run Code Online (Sandbox Code Playgroud)

但是,使用"apply"系列函数执行相同计算的代码是什么?

arrays r matrix apply

6
推荐指数
2
解决办法
1053
查看次数

如何在R中以NEWICK格式附加群集(树)节点的自举值

我想使用交互式生命树基于Web的工具(iTOL)来制作树(集群)。作为输入文件(或字符串),此工具使用Newick格式,这是一种使用括号和逗号来表示具有边长的图论树的方法。除此之外,还可能支持其他信息,例如群集节点的自举值

例如,在这里我使用包创建了用于聚类分析的数据集clusterGeneration

library(clusterGeneration)
set.seed(1)    
tmp1 <- genRandomClust(numClust=3, sepVal=0.3, numNonNoisy=5,
        numNoisy=3, numOutlier=5, numReplicate=2, fileName="chk1")
data <- tmp1$datList[[2]]
Run Code Online (Sandbox Code Playgroud)

之后,我使用程序包通过引导进行了群集分析评估了对群集节点支持pvclust

set.seed(2)    
y <- pvclust(data=data,method.hclust="average",method.dist="correlation",nboot=100)
plot(y)  
Run Code Online (Sandbox Code Playgroud)

这是集群值和引导值: 集群值和自举值

为了制作Newick文件,我使用了ape软件包:

library(ape)
yy<-as.phylo(y$hclust)
write.tree(yy,digits=2)
Run Code Online (Sandbox Code Playgroud)

write.tree 函数将以Newick格式打印树:

((x2:0.45,x6:0.45):0.043,((x7:0.26,(x4:0.14,(x1:0.14,x3:0.14):0.0064):0.12):0.22,(x5:0.28,x8:0.28 ):0.2):0.011);

这些数字表示分支长度(群集的边缘长度)。按照iTOL帮助页面上的说明(“上传和使用您自己的树”部分),我将自举值手动添加到了Newick文件中(下面的附加值):

((x2:0.45,x6:0.45)74:0.043,(((x7:0.26,(x4:0.14,(x1:0.14,x3:0.14)55:0.0064)68:0.12)100:0.22,(x5:0.28) ,x8:0.28)100:0.2)63:0.011);

当我将字符串上传到iTOL时,效果很好。但是,我有一个庞大的集群,手工完成似乎很乏味...

问题:可以执行而不是手动键入的代码是什么?

引导值可以通过以下方式获得:

(round(y$edges,2)*100)[,1:2]
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式获得用于形成Newick文件的分支长度: …

tree r cluster-analysis dendrogram pvclust

4
推荐指数
1
解决办法
2329
查看次数

将列表的(m,m,n)阵列组合成(m,m,n)阵列

什么是快速和肮脏的方式将m,m,n维度的数组,存储在一系列列表中的一个m,m,n维数组合?

例:

以下是三个包含m,m,n维数组的列表:

list1 <- array (1, dim = c(5, 5, 3)) 
list2 <- array (2, dim = c(5, 5, 3)) 
list3 <- array (3, dim = c(5, 5, 3))
Run Code Online (Sandbox Code Playgroud)

m,m,n维度的组合列表:

lists <- list(list1 = list1, list2 = list2, list3 = list3)
Run Code Online (Sandbox Code Playgroud)

我想在"lists"对象上执行一个函数,它给出了一个m,m,n维数组(例如"want.to.get"输出)

want.to.get <- array (rep (1:3, each = 5*5*3), dim = c(5,5,9))
Run Code Online (Sandbox Code Playgroud)

arrays r

2
推荐指数
1
解决办法
73
查看次数

标签 统计

r ×4

arrays ×2

apply ×1

cluster-analysis ×1

dendrogram ×1

graph ×1

inkscape ×1

matrix ×1

pvclust ×1

svg ×1

text ×1

tree ×1