我用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中保留文本对象.
如果我有阵列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"系列函数执行相同计算的代码是什么?
我想使用交互式生命树基于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文件的分支长度: …
什么是快速和肮脏的方式将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)