我正在尝试重现this paper on graph clustering的第一个数字:
以下是我的邻接矩阵的示例:
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 clustering with heatmap和R: How do I display clustered matrix heatmap (similar color patterns are grouped),但无法得到我想要的东西。
答案 0 :(得分:2)
原来这很容易。我仍在发布解决方案,所以我的案例中的其他人不会像我那样浪费时间。
第一部分与之前完全相同:
data.m=melt(data)
data.m[,"rescale"]=round(rescale(data.m[,"value"]),3)
现在,诀窍是融化数据的因素水平必须按成员资格排序:
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))
这一次,群集清晰可见。