R: Как отобразить кластеризованную матрицу тепловых карт (схожие цветовые узоры сгруппированы) - PullRequest
8 голосов
/ 16 апреля 2011

Я искал много вопросов о 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
Но я хочу, чтобы он был отсортирован по номеру кластера и выглядел так: enter image description here
Могу ли я сделать это в R?
Я искал много пакетов и пробовал много способов, но у меня все еще есть проблема.
Большое спасибо.

Ответы [ 2 ]

8 голосов
/ 16 апреля 2011

Вы можете сделать это, используя 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))

enter image description here

2 голосов
/ 17 апреля 2011

Вам следует установить Rowv и Colv на NA, если вы не хотите, чтобы дендрограммы и последующий порядок упорядочивались. Кстати, вы также должны поставить масштабирования. Используя df Andrie:

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

(Эта пользовательская функция основана на внутренней графике, используемой HeatMap между прочим, упрощенной для иллюстрации и избавляющей от всего дендрограммного материала)

enter image description here

...