はじめに
楽なので、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 。
レインボー色(grDevices::rainbow関数)の設定
レインボー・カラー 透明度 FF
Data <- data.frame ( X= 1 : 10 , Y= 1 : 10 )
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 ))
col100 <- rainbow ( 10 )
col100
plot ( Data, cex= 10 , pch= 21 , col= 1 , bg= col100, xlim= c ( 0 , 11 ), ylim= c ( 0 , 11 ))
レインボー・カラー 透明度 80
col80 <- paste ( substr ( rainbow ( 10 ), 1 , 7 ), "80" , sep= "" )
col80
plot ( Data, cex= 10 , pch= 21 , col= 1 , bg= col80, xlim= c ( 0 , 11 ), ylim= c ( 0 , 11 ))
レインボー・カラー 透明度 60
col60 <- paste ( substr ( rainbow ( 10 ), 1 , 7 ), "60" , sep= "" )
col60
plot ( Data, cex= 10 , pch= 21 , col= 1 , bg= col60, xlim= c ( 0 , 11 ), ylim= c ( 0 , 11 ))
レインボー・カラー 透明度 40
col40 <- paste ( substr ( rainbow ( 10 ), 1 , 7 ), "40" , sep= "" )
col40
plot ( Data, cex= 10 , pch= 21 , col= 1 , bg= col40, xlim= c ( 0 , 11 ), ylim= c ( 0 , 11 ))
レインボー・カラー 透明度 20
col20 <- paste ( substr ( rainbow ( 10 ), 1 , 7 ), "20" , sep= "" )
col20
plot ( Data, cex= 10 , pch= 21 , col= 1 , bg= col20, xlim= c ( 0 , 11 ), ylim= c ( 0 , 11 ))
Rで使える他のカラーパレットについて
palette()
関数を使います。
R4.0以降、デフォルトのカラーパレットが変わっています。
新しいパレットでは以前同様の色相を使用していますが、
輝度の点でよりバランスが取れており、極端に派手な色合いを避けています。
palette()関数のデフォルトカラー 透明度 FF
Data <- data.frame ( X= 1 : 8 , Y= 1 : 8 )
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 ))
pal100 <- palette ()
pal100
plot ( Data, cex= 10 , pch= 21 , col= 1 , bg= pal100, xlim= c ( 0 , 11 ), ylim= c ( 0 , 11 ))
palette()関数のデフォルトカラー 透明度 75
Data <- data.frame ( X= 1 : 8 , Y= 1 : 8 )
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 ))
pal75 <- paste ( c ( "#000000" , palette ()[ c ( - 1 , - 8 )], "#9e9e9e" ), "75" , sep= "" )
pal75
plot ( Data, cex= 10 , pch= 21 , col= 1 , bg= pal75, xlim= c ( 0 , 11 ), ylim= c ( 0 , 11 ))
まとめ
プロットの種類によるけど、透明度は60くらいが良さそうに思う。
よって、paste(substr(rainbow(10), 1, 7), "60", sep="")
を推奨。
補足
実は、もっと簡単には、rainbowの引数であるalpha値を設定しよう。
alpha値を「1より小さい値」に設定することで、半透明の設定ができる。
以下が実施例である。
alpha値 0.5 で、半透明の設定
Data <- data.frame ( X= 1 : 10 , Y= 1 : 10 )
col50 <- rainbow ( 10 , alpha = 0.5 )
par ( family= "HiraKakuProN-W3" , lwd= 1.5 , xpd= T ,
mgp= c ( 2.5 , 1 , 0 ), mai= c ( 0.7 , 0.7 , 0.2 , 0.2 ))
plot ( Data, cex= 10 , pch= 21 , col= 1 , bg= col50, xlim= c ( 0 , 11 ), ylim= c ( 0 , 11 ))
quartz.save ( paste ( "C050.png" , sep= "" ), type = "png" , dpi = 200 )
レインボーを逆順にする
col50_r <- rainbow ( 10 , alpha = 0.5 , rev = T )
par ( family= "HiraKakuProN-W3" , lwd= 1.5 , xpd= T ,
mgp= c ( 2.5 , 1 , 0 ), mai= c ( 0.7 , 0.7 , 0.2 , 0.2 ))
plot ( Data, cex= 10 , pch= 21 , col= 1 , bg= col50_r, xlim= c ( 0 , 11 ), ylim= c ( 0 , 11 ))
quartz.save ( paste ( "C050_r.png" , sep= "" ), type = "png" , dpi = 200 )
ちょっと落ち着いた感じのレインボー・プロット
library ( colorspace)
ColorSpa <- colorspace:: rainbow_hcl ( 10 , alpha = 0.5 )
par ( family= "HiraKakuProN-W3" , lwd= 1.5 , xpd= T ,
mgp= c ( 2.5 , 1 , 0 ), mai= c ( 0.7 , 0.7 , 0.2 , 0.2 ))
plot ( Data, cex= 10 , pch= 21 , col= 1 , bg= ColorSpa, xlim= c ( 0 , 11 ), ylim= c ( 0 , 11 ))
quartz.save ( paste ( "C050_ColorSpa.png" , sep= "" ), type = "png" , dpi = 200 )
【Rのジミ〜な小技シリーズ】
skume.net
skume.net
skume.net
skume.net
skume.net
skume.net
skume.net
skume.net
skume.net