dan
dan

Reputation: 6314

Cut a dendrogram

I have a dendrogram:

set.seed(10)
mat <- matrix(rnorm(20*10),nrow=20,ncol=10)
dend <- as.dendrogram(hclust(dist(mat)))

And given a depth cutoff:

I'd like to cut all branches that are to the right to that cutoff.

depth.cutoff <- 4.75

I'd like to cut all branches to the right of the dashed line:

plot(dend,horiz = TRUE)
abline(v=depth.cutoff,col="red",lty=2)

enter image description here

And to end up with this dendrogram:

enter image description here

The closest I got was using ape's drop.tip, but the problem with that is if my depth.cutoff includes all leaves, as in this example, it returns NULL.

Perhaps anyone knows if and how I can delete elements from the nested list which represents my dendrogram if their depth is below depth.cutoff?

Alternatively, perhaps I can convert the dendrogram to a data.frame, which also lists the depth of each node (including leaves which will have depth=0), remove all rows with depth < depth.cutoff from that data.frame, and then convert that back to a dendrogram?

Upvotes: 2

Views: 4459

Answers (2)

G5W
G5W

Reputation: 37661

A perhaps more direct way of getting your picture is just to set the limits that you want to plot.

plot(dend, horiz = TRUE, xlim=c(6,4.75))

Cropped Dendrogram

Upvotes: 2

SymbolixAU
SymbolixAU

Reputation: 26258

cut will cut the tree at a specified height. It will return a list of the upper and lower portions

cut(dend, h = depth.cutoff)$upper

# $upper
# 'dendrogram' with 2 branches and 5 members total, at height 5.887262 
# 
# $lower
# $lower[[1]]
# 'dendrogram' with 2 branches and 6 members total, at height 4.515119 
# 
# $lower[[2]]
# 'dendrogram' with 2 branches and 2 members total, at height 3.789259 
# 
# $lower[[3]]
# 'dendrogram' with 2 branches and 5 members total, at height 3.837733 
# 
# $lower[[4]]
# 'dendrogram' with 2 branches and 3 members total, at height 3.845031 
# 
# $lower[[5]]
# 'dendrogram' with 2 branches and 4 members total, at height 4.298743


plot(cut(dend, h = depth.cutoff)$upper, horiz = T)

enter image description here

Upvotes: 2

Related Questions