日々のつれづれ

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

色の話・その7

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

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

と、思ってます。

grDevicesパッケージの話が終わったので、2つの色パッケージの話。
RColerBrewerパッケージdichromatパッケージについて。

最後は一番書きたかった、色覚バリアフリーについて。

日本人男性の5%(約300万人)、白人男性の約8%は、赤や緑の混じった特定の範囲の色について、差を感じにくいという視覚特性を持っています。これはこれまで「赤緑色盲、赤緑色弱」もしくは単に「色盲」「色弱」と呼ばれていたものですが、このホームページでは「色盲」という言葉に統一して記します(色盲という言葉を選んだ理由については、ここをご覧下さい)。その頻度はAB型の血液型の人よりも多いくらいで(AB型は日本人で 10%、アメリカだと3%)、いかに多くの人が色盲であるかがわかるかと思います。最近はカラー印刷技術の発達やパソコン、インターネットの普及によって、カラフルな情報発信が可能になり、使用している色そのものに重要な情報が含まれているケースが多くなりました。色盲の人々は皆さんの発信する情報を十分に理解することができているのでしょうか。このホームページでは、色盲の人にも十分情報を理解してもらうためにどのような色遣いが適当でどのような工夫が必要であるかについて御紹介します。

色盲の人にもわかるバリアフリープレゼンテーション法(はじめに)から

dichromatパッケージは一般色覚者が見ている色が二色型色覚者(dichromat)にどのように見えているのかを伝えることができます。
私たちはprotanopia(赤色覚異常)とdeuteranopia(第二色盲)の方がどのような世界を見ているのか、を知ることができます。

  • dichromat関数

引数coloursにRのカラーコード(名前でも6進法でも可)を指定して、引数typeで赤緑色盲のタイプ(第二色盲なら"deutan"、赤色覚異常なら"protan")を指定すると、それぞれのカラーコードに変換します。

> library(dichromat)
> palette()
[1] "black"   "red"     "green3"  "blue"    "cyan"    "magenta" "yellow" 
[8] "gray"   
> dichromat(palette())
[1] "#2A2A2B" "#96960C" "#AEAE37" "#2B2BFE" "#DBDBFF" "#9595FB" "#FDFD2A"
[8] "#BCBCBC"
> 
> dat <- matrix(rep(1,8))
> jpeg("dichromat.jpg")
> layout(1:2)
> par(mai=c(.8,.1,.4,.4))
> barplot(dat,horiz=TRUE,col=palette(),xaxt="n",main="palette()")
> gridtext(label=palette(),at=cumsum(dat)-.5,rot=-60)
> barplot(dat,horiz=TRUE,col=dichromat(palette()),xaxt="n",main="dichromat(palette())") 
> gridtext(label=dichromat(palette()),at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ。

一般色覚者の256色カラーパレットに対応した、第二色盲、赤色覚異常が見る色をRGBで示します。
なので、データセットは256x3x3のarrayオブジェクトになり、それぞれ'normal', 'protan', 'deutan'の名前がついています。

> data(dalton)
> str(dalton)
 int [1:256, 1:3, 1:3] 255 204 153 102 51 0 255 204 153 102 ...
 - attr(*, "dimnames")=List of 3
  ..$ : NULL
  ..$ : chr [1:3] "r" "g" "b"
  ..$ : chr [1:3] "normal" "protan" "deutan"
> 
> head(dalton.colors$normal,10) # daltonのカラーパレットはdalton.colorsで呼び出す
 [1] "#FEFEFE" "#CBFEFE" "#98FEFE" "#66FEFE" "#33FEFE" "#00FEFE" "#FECBFE"
 [8] "#CBCBFE" "#98CBFE" "#66CBFE"
> head(dalton.colors$protan,10)
 [1] "#FEFEFE" "#F8F8FD" "#F5F5FD" "#F2F2FD" "#F1F1FD" "#F0F0FD" "#D1D1FE"
 [8] "#CBCBFE" "#C6C6FD" "#C3C3FD"
> head(dalton.colors$deutan,10)
 [1] "#FCFCFC" "#EEEEFC" "#E4E4FD" "#DDDDFE" "#D9D9FE" "#D8D8FE" "#DADAFB"
 [8] "#CACAFC" "#BEBEFC" "#B4B4FD"
> 
> dat <- matrix(1:256,ncol=16,byrow=TRUE)
> library(fields)
> jpeg("dalton.color.jpg",height=480*3)
> layout(1:3)
> image2(dat,col=dalton.colors$normal,main="dalton.colors$normal",lower=F)
> image2(dat,col=dalton.colors$protan,main="dalton.colors$protan",lower=F)
> image2(dat,col=dalton.colors$deutan,main="dalton.colors$deutan",lower=F)
> dev.off()

で、こんな感じ。

赤緑色盲の人でも視認できるカラーパレットです。
17種類のカラーパレットが準備されているので、RColorBrewerパッケージに負けないぐらい便利。

    • 利用できるカラーパレットの名前
茶 -> 青 BrowntoBlue.10 BrowntoBlue.12
青 -> オレンジ BluetoOrange.8 BluetoOrange.10
BluetoOrange.12 BluetoOrangeRed.14
BluetoDarkOrange.12 BluetoDarkOrange.18
赤 -> 青 DarkRedtoBlue.12 DarkRedtoBlue.18
青 -> 緑 BluetoGreen.14
青 -> グレー BluetoGray.8
LightBluetoDarkBlue.7 LightBluetoDarkBlue.10
緑 -> マゼンタ GreentoMagenta.16
グループ Categorical.12 SteppedSequential.5
> str(colorschemes)
List of 17
 $ BrowntoBlue.10        : chr [1:10] "#663000" "#996136" "#CC9B7A" "#D9AF98" ...
 $ BrowntoBlue.12        : chr [1:12] "#331A00" "#663000" "#996136" "#CC9B7A" ...
 $ BluetoDarkOrange.12   : chr [1:12] "#1F8F99" "#52C4CC" "#99FAFF" "#B2FCFF" ...
 $ BluetoDarkOrange.18   : chr [1:18] "#006666" "#009999" "#00CCCC" "#00FFFF" ...
 $ DarkRedtoBlue.12      : chr [1:12] "#2A0BD9" "#264EFF" "#40A1FF" "#73DAFF" ...
 $ DarkRedtoBlue.18      : chr [1:18] "#2400D9" "#191DF7" "#2957FF" "#3D87FF" ...
 $ BluetoGreen.14        : chr [1:14] "#0000FF" "#3333FF" "#6666FF" "#9999FF" ...
 $ BluetoGray.8          : chr [1:8] "#0099CC" "#66E6FF" "#99FFFF" "#CCFFFF" ...
 $ BluetoOrangeRed.14    : chr [1:14] "#085AFF" "#3377FF" "#5991FF" "#8CB2FF" ...
 $ BluetoOrange.10       : chr [1:10] "#0055FF" "#3399FF" "#66CCFF" "#99EEFF" ...
 $ BluetoOrange.12       : chr [1:12] "#002BFF" "#1A66FF" "#3399FF" "#66CCFF" ...
 $ BluetoOrange.8        : chr [1:8] "#0080FF" "#4CC4FF" "#99EEFF" "#CCFFFF" ...
 $ LightBluetoDarkBlue.10: chr [1:10] "#E6FFFF" "#CCFBFF" "#B2F2FF" "#99E6FF" ...
 $ LightBluetoDarkBlue.7 : chr [1:7] "#FFFFFF" "#CCFDFF" "#99F8FF" "#66F0FF" ...
 $ Categorical.12        : chr [1:12] "#FFBF80" "#FF8000" "#FFFF99" "#FFFF33" ...
 $ GreentoMagenta.16     : chr [1:16] "#005100" "#008600" "#00BC00" "#00F100" ...
 $ SteppedSequential.5   : chr [1:25] "#990F0F" "#B22D2D" "#CC5252" "#E67E7E" ...
> 
> jpeg("colorschemes.jpg",height=480*5,width=480*5)
> par(mfrow=c(4,5),mai=c(.2,.2,.5,.2))
> lapply(names(colorschemes),function(i){
+  dat <- 1:25
+  dat[-seq(colorschemes[[i]])] <- NA
+  dat <- matrix(dat,ncol=5,byrow=TRUE)
+  image2(dat,col=colorschemes[[i]],lower=F)
+  mtext(text=i,font=2,cex=2)
+ })
> dev.off()

で、こんな感じ。

自分の意見を、より多くの、より多様な人々に知ってもらい、理解してもらうためにも、この中から適切なパレットを選んでプレゼンに使いたいですね!