アメリエフの技術ブログ

Amelieff Staff Blog

【R】ヒートマップのカラースケールの調整方法

こんにちは、受託コンサルティングチームの hosor です。


今回は、R の ggplot2 を用いたヒートマップのカラースケール調整についての話です。

解析においてヒートマップを描画する際に、カラースケール調整に使う関数が似ていて混乱したので、この記事でまとめてみたいと思います。

具体的には、scale_fill_gradient(), scale_fill_gradient2(), scale_fill_gradientn() の 3 つの関数について調べてみました。

この記事ではヒートマップを描画していますが、散布図などのカラースケール調整の際にも参考にできるような内容だと思います。

作業環境

  • CentOS Linux release 7.4.1708 (Core)
  • R v4.3.1
    • ggplot2 v3.4.3
    • reshape2 v1.4.4

スクリプト

はじめに、以下の記事と同様の方法で、疑似的に遺伝子発現マトリクスを作成しました。

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

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  1.43941094  0.4368509 -1.0435105  0.95781752 -0.9601670
#gene2 -1.83885958  1.4478857  0.9476025 -1.13593066  0.2107077
#gene3 -0.45429952 -0.6610421 -0.4780290 -0.68007382  0.5995651
#gene4  0.55088996  0.4164555 -1.5181176  1.58169182  0.2219682
#gene5  0.41046950  0.6183190 -2.7040238 -0.07875714  0.1083888
#gene6 -0.03650091  0.9927547 -0.4663634  0.47552077  0.3575545

df           <- melt(data)
colnames(df) <- c("Gene", "Group", "Value")
head(df)
#   Gene Group       Value
#1 gene1     A  1.43941094
#2 gene2     A -1.83885958
#3 gene3     A -0.45429952
#4 gene4     A  0.55088996
#5 gene5     A  0.41046950
#6 gene6     A -0.03650091


scale_fill_gradient()

2 色でのグラデーションとなります。

青→赤のグラデーションになるように作成してみたところ、気味が悪い見た目となりました。

p <- ggplot(df, aes(x = Group, y = Gene, fill = Value))
p <- p + geom_tile()
p <- p + scale_fill_gradient(low = "blue", high = "red")
ggsave("Heatmap.pdf")


scale_fill_gradient2()

3 色でのグラデーションとなります。

青→白→赤のグラデーションになるように作成してみたところ、値の大小を一目で判断できるような綺麗なヒートマップを描画することができました。

上記のカラースケールを少し変えるだけで、見やすさがこんなにも違うのですね…。

p <- ggplot(df, aes(x = Group, y = Gene, fill = Value))
p <- p + geom_tile()
p <- p + scale_fill_gradient2(low = "blue", mid = "white", high = "red")
ggsave("Heatmap2.pdf")


scale_fill_gradientn()

N 色でのグラデーションとなります。

colors = c("red", "blue", ...) と 1 色ずつ指定していく方法もありますが、既存のカラーパレットを使う方がなにかと便利です。

今回は、以下のカラーパレットから heat.colors を使ってみました。

RPubs - カラーコード

p <- ggplot(df, aes(x = Group, y = Gene, fill = Value))
p <- p + geom_tile()
p <- p + scale_fill_gradientn(colors = heat.colors(7)) # 7 色
ggsave("Heatmapn.pdf")


色々と試してみましたが、グラフの性質や強調したい箇所によって、適切な表現方法を選ぶのがベストかなと感じました。

まとめ

以下の関数は、グラデーションに使用される色の数が異なる!

  • scale_fill_gradient(): 2 色
  • scale_fill_gradient2(): 3 色
  • scale_fill_gradientn(): N 色

参考

ggplot2.tidyverse.org