こんにちは、受託コンサルティングチームの 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 を使ってみました。
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 色