R:如何显示聚类矩阵热图(类似的颜色模式被分组)

时间:2011-04-16 16:28:49

标签: r ggplot2 heatmap

我在整个网站和软件包中搜索了很多关于热图的问题,但我仍然有问题。
我有集群数据(kmeans / EM / DBscan ..),我想通过对同一个集群进行分组来创建热图。我希望将相似的颜色模式分组到热图中,因此通常看起来像块对角线。
我试图通过群集编号对数据进行排序并显示它,

k = kmeans(data, 3)
d = data.frame(data)
d = data.frame(d, k$cluster)
d = d[order(d$k.cluster),]
heatmap(as.matrix(d))
但它仍然没有排序,看起来像这个链接:enter image description here但是,我希望它按簇号排序,看起来像这样:{{0 }}
我可以用R吗?做到这一点 我搜索了很多包,尝试了很多方法,但我仍有问题 非常感谢。

2 个答案:

答案 0 :(得分:8)

您可以使用reshape2ggplot2执行此操作,如下所示:

library(reshape2)
library(ggplot2)

# Create dummy data
set.seed(123)
df <- data.frame(
        a = sample(1:5, 1000, replace=TRUE),
        b = sample(1:5, 1000, replace=TRUE),
        c = sample(1:5, 1000, replace=TRUE)
)

# Perform clustering
k <- kmeans(df, 3)

# Append id and cluster
dfc <- cbind(df, id=seq(nrow(df)), cluster=k$cluster)

# Add idsort, the id number ordered by cluster 
dfc$idsort <- dfc$id[order(dfc$cluster)]
dfc$idsort <- order(dfc$idsort)

# use reshape2::melt to create data.frame in long format
dfm <- melt(dfc, id.vars=c("id", "idsort"))

ggplot(dfm, aes(x=variable, y=idsort)) + geom_tile(aes(fill=value))

enter image description here

答案 1 :(得分:2)

如果您不想要树形图和子序列,则应将RowvColv设置为NA。顺便说一句,你也应该放大规模。使用Andrie的df:

heatmap(as.matrix(df)[order(k$cluster),],Rowv=NA,Colv=NA,scale="none",labRow=NA)

enter image description here

事实上,整个热图都基于image()。你可以使用image来完全构建一个你想要的情节。 Heatmap在内部使用layout(),因此设置边距将很困难。有了图像,你可以做到:

myHeatmap <- function(x,ord,xlab="",ylab="",main="My Heatmap",
                      col=heat.colors(5), ...){
    op <- par(mar=c(3,0,2,0)+0.1)
    on.exit(par(op))
    nc <- NCOL(x)
    nr <- NROW(x)
    labCol <- names(x)

    x <- t(x[ord,])
    image(1L:nc, 1L:nr, x, xlim = 0.5 + c(0, nc), ylim = 0.5 +
        c(0, nr), axes = FALSE, xlab=xlab, ylab=ylab, main=main,
        col=col,...)

    axis(1, 1L:nc, labels = labCol, las = 2, line = -0.5, tick = 0)
    axis(2, 1L:nr, labels = NA, las = 2, line = -0.5, tick = 0)
}

library(RColorBrewer)
myHeatmap(df,order(k$cluster),col=brewer.pal(5,"BuGn"))

生成边距较小的地块。你也可以操纵轴,颜色......你绝对应该看一下RColorBrewer

(此自定义功能基于热图btw使用的内部绘图,为插图简化并去除所有树形图的东西)

enter image description here