我在整个网站和软件包中搜索了很多关于热图的问题,但我仍然有问题。
我有集群数据(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))
但它仍然没有排序,看起来像这个链接:
答案 0 :(得分: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))
答案 1 :(得分:2)
如果您不想要树形图和子序列,则应将Rowv
和Colv
设置为NA
。顺便说一句,你也应该放大规模。使用Andrie的df:
heatmap(as.matrix(df)[order(k$cluster),],Rowv=NA,Colv=NA,scale="none",labRow=NA)
事实上,整个热图都基于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使用的内部绘图,为插图简化并去除所有树形图的东西)