日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

色の話・その2

以前の日記で少し前フリしていた色の話。の続き。

  • 色は視認性が高いグラフを書くときに大切な要素
  • 色の多用は、グラフの本質を隠してしまう
  • 人が理解できる限界は3~4色じゃないだろうか

と、思ってます。

  • Rを起動すると、grDevicesパッケージが読み込まれていると思います。
> sessionInfo()
R version 2.14.1 (2011-12-22)
Platform: i686-pc-linux-gnu (32-bit)

locale:
 [1] LC_CTYPE=ja_JP.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=ja_JP.UTF-8        LC_COLLATE=ja_JP.UTF-8    
 [5] LC_MONETARY=ja_JP.UTF-8    LC_MESSAGES=ja_JP.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=ja_JP.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

こんな感じと思う。
で、grDevicesパッケージには色の関数関数がある。

  • rainbows関数

虹色のセットで、引数nでグラデーションをつけます。

> rainbow(n=7) # n=7の場合は虹の7色になる
[1] "#FF0000FF" "#FFDB00FF" "#49FF00FF" "#00FF92FF" "#0092FFFF" "#4900FFFF"
[7] "#FF00DBFF"
> rainbow(n=14) # 引数nの数で虹色が連続値で分割される
 [1] "#FF0000FF" "#FF6D00FF" "#FFDB00FF" "#B6FF00FF" "#49FF00FF" "#00FF24FF"
 [7] "#00FF92FF" "#00FFFFFF" "#0092FFFF" "#0024FFFF" "#4900FFFF" "#B600FFFF"
[13] "#FF00DBFF" "#FF006DFF"
> 
> jpeg("rainbow.jpg")
> layout(1:2)
> par(mai=c(.8,.1,.4,.4))
> dat <- matrix(rep(1,7))
> barplot(dat,horiz=TRUE,col=rainbow(n=7),xaxt="n",main="rainbow(n=7)")
> gridtext(label=rainbow(n=7),at=cumsum(dat)-.5,rot=-60)
> dat <- matrix(rep(1,14))
> barplot(dat,horiz=TRUE,col=rainbow(n=14),xaxt="n",main="rainbow(n=14)")
> gridtext(label=rainbow(n=14),at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ*1

  • heat.colors関数

暖色系のセット。同じく引数nを持ちます。
値が小 -> 大で、色は赤 -> 淡い黄色になります。

> heat.colors(n=10)
 [1] "#FF0000FF" "#FF2400FF" "#FF4900FF" "#FF6D00FF" "#FF9200FF" "#FFB600FF"
 [7] "#FFDB00FF" "#FFFF00FF" "#FFFF40FF" "#FFFFBFFF"
> 
> jpeg("heat.colors.jpg",height=240)
> par(mai=c(.8,.1,.4,.4))
> dat <- matrix(rep(1,10))
> barplot(dat,horiz=TRUE,col=heat.colors(n=10),xaxt="n",main="heat.colors(n=10)")
> gridtext(label=heat.colors(n=10),at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ。

  • terrain.colors関数

緑 -> 黄 -> クリーム色 -> 白のグラデーション(大地の色?)。同じく引数nを持ちます。

> terrain.colors(n=10) # 値が小 -> 大で、色は赤 -> クリーム色になる
 [1] "#00A600FF" "#2DB600FF" "#63C600FF" "#A0D600FF" "#E6E600FF" "#E8C32EFF"
 [7] "#EBB25EFF" "#EDB48EFF" "#F0C9C0FF" "#F2F2F2FF"
> 
> jpeg("terrain.colors.jpg",height=240)
> par(mai=c(.8,.1,.4,.4))
> dat <- matrix(rep(1,10))
> barplot(dat,horiz=TRUE,col=terrain.colors(n=10),xaxt="n",main="terrain.colors(n=10)")
> gridtext(label=terrain.colors(n=10),at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ。

  • topo.colors関数

紫 -> 青 -> 緑 -> 黄 -> クリーム色のグラデーション(天文系の色?)。同じく引数nを持ちます。

> topo.colors(n=10)
 [1] "#4C00FFFF" "#0019FFFF" "#0080FFFF" "#00E5FFFF" "#00FF4DFF" "#4DFF00FF"
 [7] "#E6FF00FF" "#FFFF00FF" "#FFDE59FF" "#FFE0B2FF"
> 
> jpeg("terrain.colors.jpg",height=240)
> par(mai=c(.8,.1,.4,.4))
> dat <- matrix(rep(1,10))
> barplot(dat,horiz=TRUE,col=topo.colors(n=10),xaxt="n",main="topo.colors(n=10)")
> gridtext(label=terrain.colors(n=10),at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ。

  • cm.colors関数

シアン -> 白 -> マゼンタのセット。同じく引数nを持ちます。

> cm.colors(n=10)
 [1] "#80FFFFFF" "#99FFFFFF" "#B2FFFFFF" "#CCFFFFFF" "#E6FFFFFF" "#FFE6FFFF"
 [7] "#FFCCFFFF" "#FFB2FFFF" "#FF99FFFF" "#FF80FFFF"
> 
> jpeg("terrain.colors.jpg",height=240)
> par(mai=c(.8,.1,.4,.4))
> dat <- matrix(rep(1,10))
> barplot(dat,horiz=TRUE,col=cm.colors(n=10),xaxt="n",main="cm.colors(n=10)")
> gridtext(label=cm.colors(n=10),at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ。

  • gray関数, gray.colors関数

グレーグラデーション。
grayは0~1の比率でグラデーションを指定、gray.colorsは引数nで等間隔のグラデーションを作る。

    • gray関数
> gray(1:10/10)
 [1] "#1A1A1A" "#333333" "#4C4C4C" "#666666" "#808080" "#999999" "#B2B2B2"
 [8] "#CCCCCC" "#E6E6E6" "#FFFFFF"
> gray(c(1,1,3,3,3,5,5,5,9,10)/10)
 [1] "#1A1A1A" "#1A1A1A" "#4C4C4C" "#4C4C4C" "#4C4C4C" "#808080" "#808080"
 [8] "#808080" "#E6E6E6" "#FFFFFF"
> 
> jpeg("gray.jpg")
> layout(1:2)
> par(mai=c(.8,.1,.4,.4))
> dat <- matrix(rep(1,10))
> barplot(dat,horiz=TRUE,col=gray(1:10/10),xaxt="n",main="gray(1:10/10)")
> gridtext(label=gray(1:10/10),at=cumsum(dat)-.5,rot=-60)
> 
> barplot(dat,horiz=TRUE,col=gray(c(1,1,3,3,3,5,5,5,9,10)/10),xaxt="n"
+ ,main="gray(c(1,1,3,3,3,5,5,5,9,10)/10)")
> gridtext(label=gray(c(1,1,3,3,3,5,5,5,9,10)/10),at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ。

    • gray.colors関数
> gray.colors(n=10) # gray(1:10/10)と少し色目が違う
 [1] "#4C4C4C" "#6C6C6C" "#838383" "#969696" "#A7A7A7" "#B5B5B5" "#C3C3C3"
 [8] "#CFCFCF" "#DBDBDB" "#E6E6E6"
> 
> jpeg("gray.colors.jpg",height=240)
> par(mai=c(.8,.1,.4,.4))
> dat <- matrix(rep(1,10))
> barplot(dat,horiz=TRUE,col=gray.colors(n=10),xaxt="n",main="gray.colors(n=10)")
> gridtext(label=gray.colors(n=10),at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ。

単調グラデーションを使うなら、gray.colorsの方が圧倒的に便利と思う。
色調も少しやさしい気がする。

  • blues9関数

青系のグラデーション。引数はない。

> blues9
[1] "#F7FBFF" "#DEEBF7" "#C6DBEF" "#9ECAE1" "#6BAED6" "#4292C6" "#2171B5"
[8] "#08519C" "#08306B"
> 
> jpeg("blues9.jpg",height=240)
> par(mai=c(.8,.1,.4,.4))
> dat <- matrix(rep(1,9))
> barplot(dat,horiz=TRUE,col=blues9,xaxt="n",main="blues9")
> gridtext(label=blues9,at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ。

"Blues9"。かっこいい名前の関数だなぁ。

今日はたくさん書いて疲れました。

*1:gridtextは、前の日記で書いた自作関数