web-dev-qa-db-ja.com

R ggplotのヒートマップのクラスターデータ

以下の私のプロットを見てください: 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

14
user3741035

これは、データに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

11
Beasterfield

私は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引数を使用してクラスタリングを手動で指定することもできます。デフォルトで使用されているものが、希望するものと一致しない場合に使用します。

3
BrodieG

data.frameの列を因子に変換する必要はないと私は付け加えましたが、ggplotscale_*_discrete関数を使用して、軸のプロット順序を設定できます。以下に示すように、limits引数を使用してプロット順序を設定し、labels引数を使用してラベルを設定するだけです。

data<-read.table(text="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", header = TRUE, stringsAsFactors = FALSE)
data <- scale(t(data))
ord <- hclust( dist(data, method = "euclidean"), method = "ward.D" )$order
pd <- as.data.frame( data )
pd$Time <- sub("_.*", "", rownames(pd))
pd.m <- melt( pd, id.vars = "Time", variable.name = "Gene" )
ggplot( pd.m, aes(Time, Gene) ) +
  geom_tile(aes(fill = value)) +
  scale_x_discrete(limits=pd.m$Time[ord], labels = c("0h", "0.25h", "0.5h","1h","2h","3h","6h","12h","24h","48h"))+
  scale_y_discrete(limits=colnames(data), labels = seq_along(colnames(data)))+
  scale_fill_gradient2(low=muted("blue"), high=muted("red"))

enter image description here

0
Alex Thomas