Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ggplot2在Dendogram中为簇着色_R_Ggplot2_Dendextend_Ggdendro - Fatal编程技术网

使用ggplot2在Dendogram中为簇着色

使用ggplot2在Dendogram中为簇着色,r,ggplot2,dendextend,ggdendro,R,Ggplot2,Dendextend,Ggdendro,Didzis Elferts展示了如何使用ggplot2和ggdendro绘制dendogram: 代码如下: 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

Didzis Elferts展示了如何使用ggplot2和ggdendro绘制dendogram:

代码如下:

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 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())
labs=paste(“sta_uz”,1:50,sep=”“)#新标签

rownames(USArrests)解决方法是使用
plot()
打印集群对象,然后使用函数
rect.hclust()
在集群周围绘制边框(集群数量由参数
k=
设置)。如果
rect.hclust()
的结果保存为对象,它将创建观察列表,其中每个列表元素包含属于每个集群的观察结果

plot(hc)
gg<-rect.hclust(hc,k=2)
新的数据帧与
label()
对象的
dendr
信息(
dendro\u data()
结果)合并


这种方法与@DidzisElferts非常相似,只是简单一点

df   <- USArrests                 # really bad idea to muck up internal datasets
labs <- paste("sta_",1:50,sep="") # new labels
rownames(df) <- labs              # set new row names

library(ggplot2)
library(ggdendro)
hc       <- hclust(dist(df), "ave")           # heirarchal clustering
dendr    <- dendro_data(hc, type="rectangle") # convert for ggplot
clust    <- cutree(hc,k=2)                    # find 2 clusters
clust.df <- data.frame(label=names(clust), cluster=factor(clust))
# dendr[["labels"]] has the labels, merge with clust.df based on label column
dendr[["labels"]] <- merge(dendr[["labels"]],clust.df, by="label")
# plot the dendrogram; note use of color=cluster in geom_text(...)
ggplot() + 
  geom_segment(data=segment(dendr), aes(x=x, y=y, xend=xend, yend=yend)) + 
  geom_text(data=label(dendr), aes(x, y, label=label, hjust=0, color=cluster), 
           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())

df加上@DidzisElferts'和@jlhoward的代码,树状图本身可以着色

library(ggplot2)
library(ggdendro)
library(plyr)
library(zoo)

df <- USArrests                       # really bad idea to muck up internal datasets
labs <- paste("sta_", 1:50, sep = "") # new labels
rownames(df) <- labs                  # set new row names

cut <- 4    # Number of clusters
hc <- hclust(dist(df), "ave")              # hierarchical clustering
dendr <- dendro_data(hc, type = "rectangle") 
clust <- cutree(hc, k = cut)               # find 'cut' clusters
clust.df <- data.frame(label = names(clust), cluster = clust)

# Split dendrogram into upper grey section and lower coloured section
height <- unique(dendr$segments$y)[order(unique(dendr$segments$y), decreasing = TRUE)]
cut.height <- mean(c(height[cut], height[cut-1]))
dendr$segments$line <- ifelse(dendr$segments$y == dendr$segments$yend &
   dendr$segments$y > cut.height, 1, 2)
dendr$segments$line <- ifelse(dendr$segments$yend  > cut.height, 1, dendr$segments$line)

# Number the clusters
dendr$segments$cluster <- c(-1, diff(dendr$segments$line))
change <- which(dendr$segments$cluster == 1)
for (i in 1:cut) dendr$segments$cluster[change[i]] = i + 1
dendr$segments$cluster <-  ifelse(dendr$segments$line == 1, 1, 
             ifelse(dendr$segments$cluster == 0, NA, dendr$segments$cluster))
dendr$segments$cluster <- na.locf(dendr$segments$cluster) 

# Consistent numbering between segment$cluster and label$cluster
clust.df$label <- factor(clust.df$label, levels = levels(dendr$labels$label))
clust.df <- arrange(clust.df, label)
clust.df$cluster <- factor((clust.df$cluster), levels = unique(clust.df$cluster), labels = (1:cut) + 1)
dendr[["labels"]] <- merge(dendr[["labels"]], clust.df, by = "label")

# Positions for cluster labels
n.rle <- rle(dendr$segments$cluster)
N <- cumsum(n.rle$lengths)
N <- N[seq(1, length(N), 2)] + 1
N.df <- dendr$segments[N, ]
N.df$cluster <- N.df$cluster - 1

# Plot the dendrogram
ggplot() + 
   geom_segment(data = segment(dendr), 
      aes(x=x, y=y, xend=xend, yend=yend, size=factor(line), colour=factor(cluster)), 
      lineend = "square", show.legend = FALSE) + 
   scale_colour_manual(values = c("grey60", rainbow(cut))) +
   scale_size_manual(values = c(.1, 1)) +
   geom_text(data = N.df, aes(x = x, y = y, label = factor(cluster),  colour = factor(cluster + 1)), 
      hjust = 1.5, show.legend = FALSE) +
   geom_text(data = label(dendr), aes(x, y, label = label, colour = factor(cluster)), 
       hjust = -0.2, size = 3, show.legend = FALSE) +
   scale_y_reverse(expand = c(0.2, 0)) + 
   labs(x = NULL, y = NULL) +
   coord_flip() +
    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())
库(ggplot2)
图书馆(GGO)
图书馆(plyr)
图书馆(动物园)

df获得类似结果的一个简单方法是使用从本文档中获取的包
dendextend

df%
集合(“分支颜色”,k=4)%>%集合(“分支颜色”,0.7)%>%
设置(“标签”,0.6)%>%set(“标签,颜色”,k=4)%>%
组(叶数,19)%>%组(叶数,0.5)

ggd1对于那些仍在寻找方便方法的用户,您可以使用my package()

如果您拥有发布示例中的数据:

labs = paste("sta_",1:50,sep="") #new labels
rownames(USArrests)<-labs #set new row names
hc <- hclust(dist(USArrests), "ave")
你可以把它转向一边,在它的头上等等。它基本上只是一个ggplot层,所以你可以根据你的意愿进一步修改图形,并将其添加到其他ggplot中。查看下一页,看看你能用GGD做些什么


+1我知道还有另外一个函数可以切割树状图,但忘记了cutree:)Muito Muito Bom!Obrigado.Ao utilizar o método“ward.D”em
hclust()
tive problemas com as etiquetas dos grupos gráfico。Não consegui分解器。我想我能理解,但我不能用葡萄牙语回答。我稍后会调查你的问题。同时,您可能希望将这些响应与
dendextend
包的功能进行比较。@Jean如果我理解正确:图表中群集的标签未连接到cluster.df中的任何标签;图表中的群集标签取自N.df。图表中的聚类标签有些随意;唯一的限制是N.df中的顺序在图表中是从下到上的。可以通过向N.df添加新标签变量来更改标签。类似于
N.df$NEWcluster的东西除了着色和旋转之外,您可以通过
plot(hc)
检查ggplot树状图是否与hclust树状图相同。在这种方法中,我们如何指定
hclust(dist(df,method=“euclidean”),method=“ward.D2”)
。。。df%%>%dist(method=“euclidean”)%%>%hclust(method=“ward.D2”)%%>%。。。只需跳过每个函数中的第一个参数,因为它是您通过管道传输到它的对象
df   <- USArrests                 # really bad idea to muck up internal datasets
labs <- paste("sta_",1:50,sep="") # new labels
rownames(df) <- labs              # set new row names

library(ggplot2)
library(ggdendro)
hc       <- hclust(dist(df), "ave")           # heirarchal clustering
dendr    <- dendro_data(hc, type="rectangle") # convert for ggplot
clust    <- cutree(hc,k=2)                    # find 2 clusters
clust.df <- data.frame(label=names(clust), cluster=factor(clust))
# dendr[["labels"]] has the labels, merge with clust.df based on label column
dendr[["labels"]] <- merge(dendr[["labels"]],clust.df, by="label")
# plot the dendrogram; note use of color=cluster in geom_text(...)
ggplot() + 
  geom_segment(data=segment(dendr), aes(x=x, y=y, xend=xend, yend=yend)) + 
  geom_text(data=label(dendr), aes(x, y, label=label, hjust=0, color=cluster), 
           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())
library(ggplot2)
library(ggdendro)
library(plyr)
library(zoo)

df <- USArrests                       # really bad idea to muck up internal datasets
labs <- paste("sta_", 1:50, sep = "") # new labels
rownames(df) <- labs                  # set new row names

cut <- 4    # Number of clusters
hc <- hclust(dist(df), "ave")              # hierarchical clustering
dendr <- dendro_data(hc, type = "rectangle") 
clust <- cutree(hc, k = cut)               # find 'cut' clusters
clust.df <- data.frame(label = names(clust), cluster = clust)

# Split dendrogram into upper grey section and lower coloured section
height <- unique(dendr$segments$y)[order(unique(dendr$segments$y), decreasing = TRUE)]
cut.height <- mean(c(height[cut], height[cut-1]))
dendr$segments$line <- ifelse(dendr$segments$y == dendr$segments$yend &
   dendr$segments$y > cut.height, 1, 2)
dendr$segments$line <- ifelse(dendr$segments$yend  > cut.height, 1, dendr$segments$line)

# Number the clusters
dendr$segments$cluster <- c(-1, diff(dendr$segments$line))
change <- which(dendr$segments$cluster == 1)
for (i in 1:cut) dendr$segments$cluster[change[i]] = i + 1
dendr$segments$cluster <-  ifelse(dendr$segments$line == 1, 1, 
             ifelse(dendr$segments$cluster == 0, NA, dendr$segments$cluster))
dendr$segments$cluster <- na.locf(dendr$segments$cluster) 

# Consistent numbering between segment$cluster and label$cluster
clust.df$label <- factor(clust.df$label, levels = levels(dendr$labels$label))
clust.df <- arrange(clust.df, label)
clust.df$cluster <- factor((clust.df$cluster), levels = unique(clust.df$cluster), labels = (1:cut) + 1)
dendr[["labels"]] <- merge(dendr[["labels"]], clust.df, by = "label")

# Positions for cluster labels
n.rle <- rle(dendr$segments$cluster)
N <- cumsum(n.rle$lengths)
N <- N[seq(1, length(N), 2)] + 1
N.df <- dendr$segments[N, ]
N.df$cluster <- N.df$cluster - 1

# Plot the dendrogram
ggplot() + 
   geom_segment(data = segment(dendr), 
      aes(x=x, y=y, xend=xend, yend=yend, size=factor(line), colour=factor(cluster)), 
      lineend = "square", show.legend = FALSE) + 
   scale_colour_manual(values = c("grey60", rainbow(cut))) +
   scale_size_manual(values = c(.1, 1)) +
   geom_text(data = N.df, aes(x = x, y = y, label = factor(cluster),  colour = factor(cluster + 1)), 
      hjust = 1.5, show.legend = FALSE) +
   geom_text(data = label(dendr), aes(x, y, label = label, colour = factor(cluster)), 
       hjust = -0.2, size = 3, show.legend = FALSE) +
   scale_y_reverse(expand = c(0.2, 0)) + 
   labs(x = NULL, y = NULL) +
   coord_flip() +
    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())
df   <- USArrests   # really bad idea to muck up internal datasets
labs <- paste("sta_",1:50,sep="") # new labels
rownames(df) <- labs # set new row names

require(magrittr)
require(ggplot2)
require(dendextend)

dend <- df %>% dist %>%
  hclust %>% as.dendrogram %>%
  set("branches_k_color", k = 4) %>% set("branches_lwd", 0.7) %>%
  set("labels_cex", 0.6) %>% set("labels_colors", k = 4) %>%
  set("leaves_pch", 19) %>% set("leaves_cex", 0.5) 
ggd1 <- as.ggdend(dend)
ggplot(ggd1, horiz = TRUE)
labs = paste("sta_",1:50,sep="") #new labels
rownames(USArrests)<-labs #set new row names
hc <- hclust(dist(USArrests), "ave")
devtools::install_github("NicolasH2/ggdendroplot")

library(ggdendroplot)
library(ggplot2)
ggplot() + geom_dendro(hc, dendrocut = 30)