Групповые переменные кластерами на тепловой карте в R

Я пытаюсь воспроизвести первую цифру этого документа по кластеру графов:

Вот пример моей матрицы смежности:

data=cbind(c(48,0,0,0,0,1,3,0,1,0),c(0,75,0,0,3,2,1,0,0,1),c(0,0,34,1,16,0,3,0,1,1),c(0,0,1,58,0,1,3,1,0,0),c(0,3,16,0,181,6,6,0,2,2),c(1,2,0,1,6,56,2,1,0,1),c(3,1,3,3,6,2,129,0,0,1),c(0,0,0,1,0,1,0,13,0,1),c(1,0,1,0,2,0,0,0,70,0),c(0,1,1,0,2,1,1,1,0,85))
colnames(data)=letters[1:nrow(data)]
rownames(data)=colnames(data)

И с этими командами я получаю следующую тепловую карту:

library(reshape)
library(ggplot2)
data.m=melt(data)
data.m[,"rescale"]=round(rescale(data.m[,"value"]),3)
p=ggplot(data.m,aes(X1, X2))+geom_tile(aes(fill=rescale),colour="white")
p=p+scale_fill_gradient(low="white",high="black")
p+theme(text=element_text(size=10),axis.text.x=element_text(angle=90,vjust=0))

Это очень похоже на график слева от рисунка 1 выше. Единственное отличие состоит в том, что (1) узлы не упорядочены случайным образом, а в алфавитном порядке и (2) вместо того, чтобы иметь только двоичные черно-белые пиксели, я использую "оттенки серой" палитры, чтобы показать силу совпадение между узлами.

Но дело в том, что очень сложно отличить любую кластерную структуру (и это будет еще более верно с полным набором из 100 узлов). Итак, я хочу упорядочить свои вершины кластерами на тепловой карте. У меня есть этот членский член от алгоритма обнаружения сообщества:

membership=c(1,2,4,2,5,3,1,2,2,3)

Теперь, как я могу получить тепловую карту, похожую на график справа от рисунка 1 выше?

Большое спасибо за любую помощь

PS: Я экспериментировал с R draw kmeans, кластеризуя с помощью тепловой карты и R: Как отображать кластерную матричную тепловую карту (аналогичные цветовые паттерны сгруппированы), но не может получить то, что я хочу.

1 ответ

Оказалось, это было очень легко. Я все еще отправляю решение, чтобы другие в моем случае не тратили время на это, как я.

Первая часть точно такая же, как и раньше:

data.m=melt(data)
data.m[,"rescale"]=round(rescale(data.m[,"value"]),3)

Теперь уловка заключается в том, что уровни факторов расплавленного data.frame должны быть упорядочены по членству:

data.m[,"X1"]=factor(data.m[,"X1"],levels=levels(data.m[,"X1"])[order(membership)])
data.m[,"X2"]=factor(data.m[,"X2"],levels=levels(data.m[,"X2"])[order(membership)])

Затем нарисуйте карту тепла (как и раньше):

p=ggplot(data.m,aes(X1, X2))+geom_tile(aes(fill=rescale),colour="white")
p=p+scale_fill_gradient(low="white",high="black")
p+theme(text=element_text(size=10),axis.text.x=element_text(angle=90,vjust=0))

На этот раз кластер четко виден.

licensed under cc by-sa 3.0 with attribution.