R ggplot中热图中的聚类数据

时间:2014-08-27 13:09:25

标签: r ggplot2 heatmap

请参阅下面的情节: enter image description here

我的代码:

 > head(data)
              X0      X1      X2       X3       X4       X5       X6        X7        X8        X9
 NM_001001144 6.52334 9.75243 5.62914 6.833650 6.789850 7.421440 8.675330 12.117600 11.551500  7.676900
 NM_001001327 1.89826 3.74708 1.48213 0.590923 2.915120 4.052600 0.758997  3.653680  1.931400  2.487570
 NM_001002267 1.70346 2.72858 2.10879 1.898050 3.063480 4.435810 7.499640  5.038870 11.128700 22.016500
 NM_001003717 6.02279 7.46547 7.39593 7.344080 4.568470 3.347250 2.230450  3.598560  2.470390  4.184450
 NM_001003920 1.06842 1.11961 1.38981 1.054000 0.833823 0.866511 0.795384  0.980946  0.731532  0.949049
 NM_001003953 7.50832 7.13316 4.10741 5.327390 2.311230 1.023050 2.573220  1.883740  3.215150  2.483410

pd <- as.data.frame(scale(t(data)))
pd$Time <- sub("_.*", "", rownames(pd))
pd.m <- melt(pd)
pd.m$variable <- as.numeric(factor(pd.m$variable, levels =     rev(as.character(unique(pd.m$variable))), ordered=F))
p <- ggplot(pd.m, aes(Time, variable))
p  + geom_tile(aes(fill = value)) + scale_fill_gradient2(low=muted("blue"), high=muted("red")) +
  scale_x_discrete(labels=c("0h", "0.25h", "0.5h","1h","2h","3h","6h","12h","24h","48h")) + 
   theme_bw(base_size=20) + theme(axis.text.x=element_text(angle=0, vjust=0.5, hjust=0, size=12),
   axis.text.y=element_text(size=12), strip.text.y=element_text(angle=0, vjust=0.5, hjust=0.5, size=12),
   strip.text.x=element_text(size=12)) + labs(y="Genes", x="Time (h)", fill="")

是否可以对绘图进行聚类,以便绘图显示时间过程中的动态。我想使用以下出现的聚类:

 hc.cols <- hclust(dist(t(data)))

enter image description here

3 个答案:

答案 0 :(得分:10)

您可以在将hclust应用于数据后,通过在树形图中定义时间点的顺序来实现此目的:

data <- scale(t(data))
ord <- hclust( dist(data, method = "euclidean"), method = "ward.D" )$order
ord
[1]  2  3  1  4  8  5  6 10  7  9

您唯一需要做的就是将时间列转换为factor,其中因子级别按ord排序:

pd <- as.data.frame( data )
pd$Time <- sub("_.*", "", rownames(pd))
pd.m <- melt( pd, id.vars = "Time", variable.name = "Gene" )

pd.m$Gene <- factor( pd.m$Gene, levels = colnames(data), labels = seq_along( colnames(data) ) )
pd.m$Time <- factor( pd.m$Time, levels = rownames(data)[ord],  labels = c("0h", "0.25h", "0.5h","1h","2h","3h","6h","12h","24h","48h") )

其余部分由ggplot自动完成:

ggplot( pd.m, aes(Time, Gene) ) +
  geom_tile(aes(fill = value)) +
  scale_fill_gradient2(low=muted("blue"), high=muted("red"))

enter image description here

答案 1 :(得分:3)

我不认为ggplot支持开箱即用,但您可以使用heatmap

 heatmap(
   as.matrix(dat), Rowv=NA,
   Colv=as.dendrogram(hclust(dist(t(as.matrix(dat)))))
 )

enter image description here

请注意,这看起来不像你的,因为我只是使用了数据的head,而不是整个事情。

在这里,我们使用从hclust派生的Colv参数的树形图手动指定聚类。您也可以通过Colv参数手动指定群集,前提是默认情况下使用的群集与您想要的一致。

答案 2 :(得分:0)

我想补充一下,您不需要将data.frame中的列转换为因数,可以使用ggplot的{​​{1}}函数来设置轴的绘制顺序。只需使用scale_*_discrete参数设置打印顺序,并使用limits参数设置标签,如下所示。

labels

enter image description here