R: ComplexHeatmap でヒートマップに行アノテーションを追加する

UB3/informatics/r/heatmap_annotation

このページの最終更新日: 2023/02/14


  1. 概要: Heatmap annotation とは
  2. width を使う方法
  3. ComplexHeatmap のアノテーションとして追加する方法

広告

概要: Heatmap annotation とは

ヒートマップの上下や横に加える追加情報を heatmap annotation という。上下の場合、列に対して情報を追加することになるので、列アノテーション column annotation という。

行に対して情報を追加する場合は、行アノテーション row annotation であり、ヒートマップの右か左に別の図がつくことになる。

このページでは、R の ComplexHeatmap という関数で行アノテーションを追加する方法をまとめる。列アノテーションの追加方法は、ComplexHeatmap でヒートマップに列アノテーションを追加する を参照のこと。

width を使う方法

アノテーションというよりは、複数のヒートマップを並べて配置するようなイメージ。

組み込みデータセット mtcars を例として使用。mtcars はこんな感じのデータセット。車の性能がまとめられている。

Rの組み込みデータセット mtcars

まずはただ heatmap を作って様子を見てみる。

Heatmap(mtcars)

デフォルトの色は赤 - 青、両軸でクラスタリングされるので、以下のような図が出力される。排気量 displacement と馬力 horse power, hp の数値が大きいので、その他の部分が真っ青になってしまう。

さらに、cyl と gear はシリンダーとギアの数で、整数値をもつ離散変数。vs と am は、エンジン (0 = V-shaped, 1 = straight) と Transmission (0 = automatic, 1 = manual) で、0 または 1 の二値変数である。全部をそのまま heatmap に投げ込むのは正しくない。

Rで作成したmtcarsのヒートマップ

なお、R デフォルトの heatmap 関数を使うとこんな色合いになる (クリックで拡大)。

Rで作成したmtcarsのヒートマップ

さらに、input が matrix でなく dataframe なので変換したという警告メッセージが出る。

Warning message: The input is a data frame-like object, convert it to a matrix.

heatmap を作る場合は、as.matrix でマトリクスに変換するのが基本である (→ R の行列とデータフレームの違い)。さらに cyl, gear, vs, am を除いて、以下のようにする。

mtcars2 = select(mtcars, -c(cyl, gear, vs, am))
Heatmap(as.matrix(mtcars2))

Rで作成したmtcarsのヒートマップ

右側に、先ほど取り除いた cyl や gear を追加してみよう。width という方法を使う。

別々のヒートマップをそれぞれ width1, width2... というオブジェクトに入れて、width1 + width2 のようにして表示させるイメージ。

width1 = Heatmap(as.matrix(mtcars2),
show_row_names = TRUE, row_names_side = "left", name = "param")

width2 = Heatmap(as.matrix(mtcars$cyl), name = "cyl")
width3 = Heatmap(as.matrix(mtcars$gear), name = "gear")

width1 + width2 + width3

Rで作成したmtcarsのヒートマップ

vs, am は 0/1 の二値変数なので、それらを赤と緑で指定するパターン。フォントサイズの変更などもして見やすくした。

Rで作成したmtcarsのヒートマップ

ComplexHeatmap のアノテーションとして追加する方法

以下のような手順になる。

  • rowAnnotation 関数を使ってアノテーションを指定し、それをオブジェクトとして保存する。
  • Heatmap 関数の中で、そのオブジェクトを right_annotation または left_annotation として参照する。

rowAnnotation 関数は、HeatmapAnnotation 関数に内容を引き渡して実行しているらしい。色の指定など、HeatmapAnnotation 関数のところで解説されている方法を使っても動くことがある。

ヒートマップの行アノテーション

同じく mtcars を使い、mpg をアノテーションとして表示してみる。

Rで作成したmtcarsのヒートマップ 行アノテーション

rowAnnotation 関数では、mpg = mtcars$mpg のように単にデータフレームを指定すると、アノテーションがヒートマップになる。

Heatmap に入れる段階で、マトリックスとアノテーションの順番を揃えておく必要がある。つまり、上の例では mtcars3 と mtcars$mpg で、行が同じ順に並んでいる必要がある。そうすれば、アノテーションも一緒にクラスタリングされる。

この場合、mtcars$mpg は mtcars の一部なので、何もしなくても順番は一致している。Lotus Europa, Fiat 128, Honda Civic, Toyora Corora など mpg が高いことで確認可能。外部データを参照してアノテーションを作る場合には、順番にも注意を払う必要がある。

色を指定する際には、カテゴリー変数なら次のようになる。vec1 というベクターがあり、これを df という名前のアノテーションとして追加している。a, b, c というベクターの要素に対して、それぞれ色を指定する。show_annotation_name は、annotation の下に名前を表示するかどうか。書き方が少しわかりにくい。

棒グラフの行アノテーション

行アノテーションを棒グラフにしたい場合は、以下のように anno_barplot として指定する。bar のところは表示される名前を指定するだけなので、もちろん上の例のように mpg でも良い。

Rで作成したmtcarsのヒートマップ 行アノテーション

anno_numeric を使うと、棒グラフにプラスとマイナスを表示できる。

Rで作成したmtcarsのヒートマップ 行アノテーション
広告

References

Script: ub_related/R_script/Practice_heatmap_1_v1.R

  1. R : matrixとdata.frameの違い. Link: Last access 2022/05/21.

コメント欄

サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。