京橋のバイオインフォマティシャンの日常

まずは、データ分析、コマンドラインのメモとして

【Rのジミ〜な小技シリーズ】Rのどぎついレインボー・カラーを和らげて、使える色へと変換するTipsについて

楽なので、Rのplot()時に、レインボー色(grDevices::rainbow)を使うんだけど、 お世辞にも良い色とは言えず、ドギツイ色を使うねと周囲から言われる。

今回、それを挽回するために、そのレインボー色を和らげる方法を紹介する。

rainbow関数では、16進数で表される「カラーコード」*1 + 透明度が出力される。 そのため、透明度の設定を変更すると、程良いレインボー・カラーにすることができる。

例えば、grDevices::rainbow(10)の出力結果は、次のようになる。

grDevices::rainbow(10)

 [1] "#FF0000FF" "#FF9900FF" "#CCFF00FF"
 [4] "#33FF00FF" "#00FF66FF" "#00FFFFFF"
 [7] "#0066FFFF" "#3300FFFF" "#CC00FFFF"
[10] "#FF0099FF"

最後の2桁 FF は、透明度ゼロ(非透明)という意味になるので、 そこを数字に置き換える。

この文字列処理には、文字列の部分抽出ができる、base::substr関数を使用する。 substr関数で、カラーコードの1文字目から7文字目までを抜き出して、 任意の数字2桁とくっ付ければ、色変換ができる。

実際に、FF、80、60、40、20でのプロット結果を見てみる*2

#プロットデータ
Data <- data.frame(X=1:10, Y=1:10)

#par設定
par(family="HiraKakuProN-W3", lwd=1.5, xpd=F, 
    mgp=c(2.5, 1, 0), mai=c(0.7,0.7, 0.2, 0.2))

#レインボー・カラー 透明度 FF
col100 <- rainbow(10)
col100
#上記と同じ
# [1] "#FF0000FF" "#FF9900FF" "#CCFF00FF"
# [4] "#33FF00FF" "#00FF66FF" "#00FFFFFF"
# [7] "#0066FFFF" "#3300FFFF" "#CC00FFFF"
#[10] "#FF0099FF"

plot(Data, cex=10, pch=21, col=1, bg=col100, xlim=c(0,11), ylim=c(0,11))

#図保存 for Mac
#quartz.save(paste("C100.png", sep=""), type = "png", dpi = 200)

https://kumes.github.io/Blog/Rainbow_plot/C100.png

#レインボー・カラー 透明度 80
col80 <- paste(substr(rainbow(10), 1, 7), "80", sep="")

col80
# [1] "#FF000080" "#FF990080" "#CCFF0080"
# [4] "#33FF0080" "#00FF6680" "#00FFFF80"
# [7] "#0066FF80" "#3300FF80" "#CC00FF80"
#[10] "#FF009980"

plot(Data, cex=10, pch=21, col=1, bg=col80, xlim=c(0,11), ylim=c(0,11))
#quartz.save(paste("C080.png", sep=""), type = "png", dpi = 200)

https://kumes.github.io/Blog/Rainbow_plot/C080.png

#レインボー・カラー 透明度 60
col60 <- paste(substr(rainbow(10), 1, 7), "60", sep="")
col60
# [1] "#FF000060" "#FF990060" "#CCFF0060"
# [4] "#33FF0060" "#00FF6660" "#00FFFF60"
# [7] "#0066FF60" "#3300FF60" "#CC00FF60"
#[10] "#FF009960"

plot(Data, cex=10, pch=21, col=1, bg=col60, xlim=c(0,11), ylim=c(0,11))
#quartz.save(paste("C060.png", sep=""), type = "png", dpi = 200)

https://kumes.github.io/Blog/Rainbow_plot/C060.png

#レインボー・カラー 透明度 40
col40 <- paste(substr(rainbow(10), 1, 7), "40", sep="")
col40
# [1] "#FF000040" "#FF990040" "#CCFF0040"
# [4] "#33FF0040" "#00FF6640" "#00FFFF40"
# [7] "#0066FF40" "#3300FF40" "#CC00FF40"
#[10] "#FF009940"

plot(Data, cex=10, pch=21, col=1, bg=col40, xlim=c(0,11), ylim=c(0,11))
#quartz.save(paste("C040.png", sep=""), type = "png", dpi = 200)

https://kumes.github.io/Blog/Rainbow_plot/C040.png

#レインボー・カラー 透明度 20
col20 <- paste(substr(rainbow(10), 1, 7), "20", sep="")
col20
# [1] "#FF000020" "#FF990020" "#CCFF0020"
# [4] "#33FF0020" "#00FF6620" "#00FFFF20"
# [7] "#0066FF20" "#3300FF20" "#CC00FF20"
#[10] "#FF009920"

plot(Data, cex=10, pch=21, col=1, bg=col20, xlim=c(0,11), ylim=c(0,11))
#quartz.save(paste("C020.png", sep=""), type = "png", dpi = 200)

https://kumes.github.io/Blog/Rainbow_plot/C020.png

まとめ

プロットの種類によるけど、透明度は60くらいが良さそうに思う。

よって、paste(substr(rainbow(10), 1, 7), "60", sep="")を推奨。

*1:https://woma2.com/design/colorcodes-post-1203/

*2:透明度が分かるよう、あえてマーカーを重ねてみた