ggplot でヒートマップを描く方法

geom_tile

ggplot でヒートマップを描くとき geom_tile を利用する。geom_tile を利用する場合、クラスタリングが行われないので、予めクラスタリングを行ってその並び順を取得する必要がある。

library(ggplot2)
library(reshape2)

data <- matrix(rnorm(100), ncol = 5)
colnames(data) <- c("A", "B", "C", "D", "E")
rownames(data) <- paste0("gene", 1:nrow(data))
head(data)
##                 A           B         C            D           E
## gene1 -0.11711716 -1.11684283 0.1254322  1.488207104 -0.45142685
## gene2 -1.16152046 -0.12906816 0.3689287  0.005527114 -0.99741336
## gene3  2.01008582  0.37257467 1.5218607  0.442741545 -0.23218301
## gene4 -0.26018198  0.82453768 0.3301645 -0.345951426  1.08438069
## gene5 -2.01863764 -0.08232904 0.7288576 -1.249200664 -0.06960734
## gene6  0.04873271  0.63207776 1.7279752 -0.736363727 -0.08203153

df           <- melt(data)
colnames(df) <- c("Gene", "Group", "Value")
head(df)
##    Gene Group       Value
## 1 gene1     A -0.11711716
## 2 gene2     A -1.16152046
## 3 gene3     A  2.01008582
## 4 gene4     A -0.26018198
## 5 gene5     A -2.01863764
## 6 gene6     A  0.04873271

次にクラスタリングを行い、その結果に従いデータの順序を並べ替える。

dev.new()
clr <- heatmap(data, scale = "none")
dev.off()

gene.idx  <- rownames(data)[clr$rowInd]
group.idx <- colnames(data)[clr$colInd]

df$Gene  <- factor(df$Gene, levels = gene.idx)
df$Group <- factor(df$Group, levels = group.idx)

最後に geom_tile を利用してヒートマップを仕上げる。

ghm <- ggplot(df, aes(x = Group, y = Gene, fill = Value))
ghm <- ghm + geom_tile()
ghm <- ghm + theme_bw()
ghm <- ghm + theme(plot.background = element_blank(),
                   panel.grid.minor = element_blank(),
                   panel.grid.major = element_blank(),
                   panel.background = element_blank(),
                   axis.line = element_blank(),
                   axis.ticks = element_blank(),
                   strip.background = element_rect(fill = "white", colour = "white"),
                   axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
ghm <- ghm + scale_fill_gradientn("value", colours = rev(brewer.pal(9, "Spectral")), na.value = "white")
ghm <- ghm + xlab("Group") + ylab("Gene")
ghm