やること
Rのパッケージpheatmapはmatrixを突っ込むだけでもheatmapを作ってくれる便利な関数ですが、ラベルや色などを指定することでよりいい感じになります。
一方で、パラメータの指定は中々勘ではできない仕様なので、軽くまとめます。
(色々指定したheatmap)
データ
デフォルトでインストールされているirisからサンプリングして使います。
irisは三種類の花の花弁やがくについてのデータです。
上図のように、pheatmapでは複数のラベルを表示できるので、今回は花の種類(Species)に加えて、適当にLotというラベルをつけてみます。
実際にデータを整形していきます。
library(tidyverse)
set.seed(1)
N <- 3
# 各種から3データ(計9データ)を3回に分けて取得
iris2 <- iris %>%
group_by(Species) %>% nest() %>%
mutate(
sample=map(data,~{
bind_rows(
.x[sample(50,N),],
.x[sample(50,N),],
.x[sample(50,N),],
) %>%
mutate(Lot=rep(paste0('Lot',1:3),each=N))
})
) %>%
select(-data) %>%
unnest(sample) %>%
ungroup() %>%
as.data.frame()
rownames(iris2) <- paste0('s',1:(N*3*3))
# s1~s27のデータ番号をrownamesに与える
色々指定する
1. heatmapにする相関行列
df <- iris2 %>% select(-Species,-Lot) %>% as.data.frame()
co <- cor(t(df))
diag(co) <- NA
# 対角成分は必ず1となり、見る必要はないのでNAにしておく
2. annotationを指定するオブジェクト
anno <- iris2 %>% select(Species,Lot)
annoのrownamesには、corのrownames, colnames(もしくはどちらか一方)に対応するインデックスが入っている必要があります。
今回はcorとannoの両方に、iris2で与えたs1~s27が残っているので、selectするだけで大丈夫です。
3. annotationの色を指定するオブジェクト
pal1 <- ggsci::scale_color_d3('category10')
pal2 <- ggsci::scale_color_tron()
col.species <- pal1$palette(3)
col.lot <- pal2$palette(3)
# カラーコードのベクトルを作成しているだけなので、以下のようにシンプルに手打ちでもいけます
# col.lot <- c("#FF410DFF","#6EE2FFFF","#F7C530FF")
names(col.species) <- unique(iris$Species)
names(col.lot) <- paste0('Lot',1:3)
# names属性にannoの要素を与える
anno_color <- list(
Species = col.species,
Lot= col.lot
)
# annoの列名に対応する名前をnamesに
4. ヒートマップを描く
pheatmap::pheatmap(
mat = co,
color = viridis::viridis(256),
annotation_row = anno,
annotation_col = anno,
annotation_colors = anno_color,
border_color='gray',
cellheight = 10,
cellwidth = 10
)
annotationもろもろの他に、ヒートマップの色、格子の色、cellのサイズを指定しました。
再掲。
SpeciesとLotの相関に与える影響の違いが一眼でわかるので、アノテーションがあるだけで大分違います。
今回は相関行列を使ったので、行と列のラベルが一致していますが、annotation_row、annotation_colに与えるオブジェクトを別々に作成することで、対象ではないmatrixについてもアノテーションが可能です。