9

我在整个网站和包中搜索了很多关于热图的问题,但我仍然有一个问题。
我有集群数据(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))
但它仍然没有排序,看起来像这个链接:在此处输入图像描述
但是,我希望它按其簇号排序,看起来像这样:在此处输入图像描述
我可以在 R 中执行此操作吗?
我搜索了很多包并尝试了很多方法,但我仍然有问题。
非常感谢。

4

2 回答 2

8

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

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))

在此处输入图像描述

于 2011-04-16T17:18:29.657 回答
2

如果您不想要树状图和后续排序,您应该设置Rowv和。顺便说一句,你也应该把缩放。使用 Andrie 的 df :ColvNA

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

在此处输入图像描述

事实上,整个热图都是基于image(). 您可以随意使用image来构建您想要的情节。热图在内部使用 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 使用的内部绘图,为说明而简化并摆脱所有树状图的东西)

在此处输入图像描述

于 2011-04-17T15:22:26.660 回答