简体   繁体   English

(慢边着色)如何避免循环所有tip.labels(包猿)

[英](slow edge coloring) how to avoid looping all tip.labels (package ape)

I am coloring edges in phylo trees generated with some functions from "ape" 我在使用“ape”中的一些函数生成的phylo树中着色边缘

Since I've always programmed in C, I still find it hard to stop thinking in a loop-like manner. 由于我总是用C编程,我仍然觉得很难停止以类似循环的方式思考。

The only way I can think of doing this is by (1) looping all the tip.labels (IDs), (2) finding out which edges belong to them and (3) setting the desired color. 我能想到的唯一方法是通过(1)循环所有tip.labels(ID),(2)找出属于它们的边缘和(3)设置所需的颜色。

This is done 1 by 1 and therefore is incredibly slow for big trees: 这是1比1完成的,因此大树的速度非常慢:

tsampltime.rooted=structure(list(edge = structure(c(24L, 24L, 24L, 24L, 24L, 25L, 
26L, 26L, 27L, 27L, 28L, 28L, 25L, 29L, 29L, 30L, 30L, 30L, 30L, 
24L, 31L, 31L, 32L, 32L, 32L, 33L, 33L, 34L, 35L, 35L, 34L, 36L, 
36L, 34L, 37L, 37L, 1L, 2L, 12L, 23L, 25L, 26L, 6L, 27L, 5L, 
28L, 3L, 4L, 29L, 7L, 30L, 8L, 9L, 10L, 11L, 31L, 13L, 32L, 21L, 
22L, 33L, 20L, 34L, 35L, 14L, 15L, 36L, 16L, 17L, 37L, 18L, 19L
), .Dim = c(36L, 2L)), Nnode = 14L, tip.label = c("0", "2325", 
"55304", "124953", "72254", "66507", "85089", "110256", "123265", 
"97350", "123721", "36770", "48692", "110612", "97224", "104337", 
"124625", "128499", "120928", "88404", "73335", "75059", "17928"
), edge.length = c(0, 0.953297, 8.054944, 4.4120893, 9.173083, 
1.409346, 3.752752, 0.483517, 4.620875, 0.582417, 0.510989, 12.4862723, 
6.291209, 1.920329, 3.071429, 4.5027528, 5.497248, 2.777472, 
5.5274749, 8.414843, 2.5467017, 3.79121, 3.824171, 3.961538, 
3.804944, 2.126375, 1.75275, 1.93956, 3.3516546, 1.57418, 2.31319, 
2.22528, 4.0384651, 3.898348, 2.722523, 1.87088)), .Names = c("edge", 
"Nnode", "tip.label", "edge.length"), class = "phylo", order = "cladewise")
   ... 
#distValuesPerId[,] has [LABELID,COLOR]
distValuesPerId=source('http://ubuntuone.com/5y7ZYCWfE73T5lhnUpmeXc')
...
uniqueIDs=unique(tree$tip.label)
distTrdsampledcol <-rep("black", length(tree$edge)) #init in black
for(i in uniqueIDs) { #(1)
    a= c(which(tree$tip.label==i)) 
    b= which(tree$edge[,2]== a) #(2)
    distTrdsampledcol [ b ] <- distValuesPerId[i,2] #(3)
}
...
#plot(tree, edge.color=distTrdsampledcol)

Can anyone help me to rethink this? 任何人都可以帮我重新考虑一下吗? Is there a more efficient of doing this? 这样做有效吗?

在此输入图像描述

Thanks in advance! 提前致谢!

j Ĵ

You might be overthinking this. 你可能会过度思考这一点。 Just subselect the colours you need from your giant colour data.frame . 只需从巨型颜色数据data.frame选择您需要的颜色data.frame

plot(tree,edge.color=distValuesPerId[tree$tip.label,2])

Try out the examples list on ?plot.phylo , they have a ton of examples of really cool things you can do with your trees, including colouring. 试试一下?plot.phylo上的例子清单,他们有很多你可以用树做的很酷的例子,包括着色。 It might give you some ideas. 它可能会给你一些想法。


After seeing your comment, I realized, that I had misunderstood the question. 看到你的评论后,我意识到,我误解了这个问题。 This should do what you want without loops: 这应该做你想要的没有循环:

cols=distValuesPerId[match(tree$tip.label[tree$edge[,2]],distValuesPerId[,1]),2]
my.cols=ifelse(is.na(cols),'black',cols)
plot(tree, edge.color=my.cols)

Breaking it down: 打破它:

# Find the tip labels associated with each edge, NA if it is not an edge to a tip
edge.tip.labels=tree$tip.label[tree$edge[,2]]
# Match each of those tip labels to the label column in your colur data frame
edge.rows=match(edge.tip.labels,distValuesPerId[,1])
# Find the colour for each of those rows
cols=distValuesPerId[edge.rows,2]
# Where it is NA, convert it to 'black' (where it is not a 'tip edge')
my.cols=ifelse(is.na(cols),'black',cols)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM