superponer - Dendrograma horizontal en R con etiquetas
superponer graficas en r ggplot (2)
Estoy tratando de dibujar un dendrograma de la salida de la función hclust
. Espero que el dendrograma se organice horizontalmente en lugar del predeterminado, que se puede obtener (por ejemplo)
require(graphics)
hc <- hclust(dist(USArrests), "ave")
plot(hc)
Intenté usar la función as.dendrogram()
como plot(as.dendrogram(hc.poi),horiz=TRUE)
pero el resultado es sin etiquetas significativas:
Si uso plot(hc.poi,labels=c(...))
que no tiene el as.dendrogram()
, puedo pasar el argumento labels=
, pero ahora el dendrograma es vertical en lugar de horizontal. ¿Hay una manera de organizar simultáneamente el dendrograma horizontalmente y asignar etiquetas especificadas por el usuario? ¡Gracias!
Actualización : como ejemplo del conjunto de datos de USArrests, supongamos que quiero usar las abreviaturas de las dos primeras letras de los nombres de los estados como etiquetas, de modo que quiero pasar los labs
a la función de trazado:
labs = substr(rownames(USArrests),1,2)
lo que da
[1] "Al" "Al" "Ar" "Ar" "Ca" "Co" "Co" "De" "Fl" "Ge" "Ha"
[12] "Id" "Il" "In" "Io" "Ka" "Ke" "Lo" "Ma" "Ma" "Ma" "Mi"
[23] "Mi" "Mi" "Mi" "Mo" "Ne" "Ne" "Ne" "Ne" "Ne" "Ne" "No"
[34] "No" "Oh" "Ok" "Or" "Pe" "Rh" "So" "So" "Te" "Te" "Ut"
[45] "Ve" "Vi" "Wa" "We" "Wi" "Wy"
Para mostrar sus etiquetas definidas en un dendrograma horizontal, una solución es establecer los nombres de las filas del marco de datos a nuevas etiquetas (todas las etiquetas deben ser únicas).
require(graphics)
labs = paste("sta_",1:50,sep="") #new labels
USArrests2<-USArrests #new data frame (just to keep original unchanged)
rownames(USArrests2)<-labs #set new row names
hc <- hclust(dist(USArrests2), "ave")
par(mar=c(3,1,1,5))
plot(as.dendrogram(hc),horiz=T)
EDITAR - solución utilizando ggplot2
labs = paste("sta_",1:50,sep="") #new labels
rownames(USArrests)<-labs #set new row names
hc <- hclust(dist(USArrests), "ave")
library(ggplot2)
library(ggdendro)
#convert cluster object to use with ggplot
dendr <- dendro_data(hc, type="rectangle")
#your own labels (now rownames) are supplied in geom_text() and label=label
ggplot() +
geom_segment(data=segment(dendr), aes(x=x, y=y, xend=xend, yend=yend)) +
geom_text(data=label(dendr), aes(x=x, y=y, label=label, hjust=0), size=3) +
coord_flip() + scale_y_reverse(expand=c(0.2, 0)) +
theme(axis.line.y=element_blank(),
axis.ticks.y=element_blank(),
axis.text.y=element_blank(),
axis.title.y=element_blank(),
panel.background=element_rect(fill="white"),
panel.grid=element_blank())
Usando dendrapply
puedes personalizar tu dendro como quieras.
colLab <- function(n) {
if(is.leaf(n)) {
a <- attributes(n)
attr(n, "label") <- substr(a$label,1,2) # change the node label
attr(n, "nodePar") <- c(a$nodePar, lab.col = ''red'') # change the node color
}
n
}
require(graphics)
hc <- hclust(dist(USArrests), "ave")
clusDendro <- as.dendrogram(hc)
clusDendro <- dendrapply(clusDendro, colLab)
op <- par(mar = par("mar") + c(0,0,0,2))
plot(clusDendro,horiz=T)