日々のつれづれ

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

色の話・その4

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

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

と、思ってます。

ここでは、Rを起動すると自動的に読み込まれるgrDevicesパッケージの話。

Rには色のパラメータを指定して着色する3つの関数、RGB関数、hsv関数、そしてhsl関数があります。
それぞれ、パラメータの指定方法が違うのですが、自分のフィールドにあった指定方法があるのでしょうか?

ちなみに、RGB色空間、HSV色空間とHSL色空間の説明はこんな感じでした。

色はよく、色空間という観点で考えられます。最も一般的に使用される色空間は、RGB (赤、緑、青)、HSL (色相、彩度、輝度)、および HSV (色相、彩度、値) です。

RGB の色空間は、立方体として視覚化できます。
ディスプレイには RGB が採用されているため、開発者はよく色を RGB で考えますが、RGB の色空間は人間の知覚には対応しません。たとえば、濃いシアンに赤を追加した場合、知覚的には赤みが強くなるわけではなく、シアンが薄くなったと感じられます。

HSL と HSV の色空間は、色相、彩度、輝度または明度の 3 つの要素で構成されています。この 2 つの色空間はより人間の知覚に近いので、RGB の代わりによく使用されます。
HSL の色空間は、双円すいで示され、最上部が白、最下部が黒、中央部が中間色になります。
HSV の色空間も、単一の円すいであるという点を除いて HSL と同様です。

だそうな。
私はデザイナーではないので、細かいところは良く分かりません。

色相(hue)、彩度(chroma)、輝度(luminance)を指定して色を作る関数。
alphaは透過性を指定する。
下のHSL関数とよく似ていますが、上の説明の通り、認識する色空間の形状が違うということ。色空間は単一の円すい空間になる(そうだ)。

> dat <- matrix(rep(1,14))
> (x <- hsv(h=seq(0,1,length.out=14),s=1,v=1))
 [1] "#FF0000" "#FF7600" "#FFEB00" "#9DFF00" "#27FF00" "#00FF4E" "#00FFC4"
 [8] "#00C4FF" "#004EFF" "#2700FF" "#9D00FF" "#FF00EB" "#FF0076" "#FF0000"
> (y <- hsv(h=.5,s=1,v=seq(0,1,length.out=14)))
 [1] "#000000" "#001414" "#002727" "#003B3B" "#004E4E" "#006262" "#007676"
 [8] "#008989" "#009D9D" "#00B1B1" "#00C4C4" "#00D8D8" "#00EBEB" "#00FFFF"
> 
> jpeg("hsvcolorspace.jpg")
> layout(1:2)
> par(mai=c(.8,.1,.4,.4))
> barplot(dat,horiz=TRUE,col=x,xaxt="n",main="hsv(h=seq(0,1,length.out=14),s=1,v=1)")
> gridtext(label=x,at=cumsum(dat)-.5,rot=-60)
> 
> barplot(dat,horiz=TRUE,col=y,xaxt="n",main="hsv(h=.5,s=1,v=seq(0,1,length.out=14)))")
> gridtext(label=y,at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ。

  • hcl関数

色相(hue)、彩度(saturation)、明度(value)を指定して色を作る関数。
おなじく、alphaは透過性を指定する。
上のHSV色空間とよく似ていますが、上の説明の通り、認識する色空間の形状が違うということ。色空間は双円すい空間になる(そうで)、純色の輝度が 50% になる。

> dat <- matrix(rep(1,14))
> (x <- hcl(h=seq(0,360,length.out=14),c=50,l=50))
 [1] "#AD6071" "#A56851" "#957132" "#7E7A20" "#5E8131" "#2E8750" "#00896F"
 [8] "#00888A" "#00839F" "#5479AB" "#816CAC" "#9D62A1" "#AB5D8C" "#AD6071"
> (y <- hcl(h=120,c=100,l=seq(0,100,length.out=14)))
 [1] "#000000" "#002600" "#003700" "#004900" "#005C00" "#006F00" "#008200"
 [8] "#209600" "#3EAB00" "#57C000" "#6ED62B" "#85EC50" "#9BFF6C" "#B2FF86"
> 
> jpeg("hclcolorspace.jpg")
> layout(1:2)
> par(mai=c(.8,.1,.4,.4))
> barplot(dat,horiz=TRUE,col=x,xaxt="n",main="hcl(h=seq(0,360,length.out=14),c=50,l=50)")
> gridtext(label=x,at=cumsum(dat)-.5,rot=-60)
> 
> barplot(dat,horiz=TRUE,col=y,xaxt="n",main="hcl(h=120,c=100,l=seq(0,100,length.out=14)")
> gridtext(label=y,at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ。

  • rgb関数

赤(red)、緑(green)、青(blue)を指定して色を作る関数。
おなじく、alphaは透過性を指定する。
それぞれの色の階調は0からmaxColorValueで指定する。
階調指定が面倒な場合はnamesで指定してもいい。

> dat <- matrix(rep(1,14))
> (x <- rgb(r=seq(0,1,length.out=14),g=1,b=0))
 [1] "#00FF00" "#14FF00" "#27FF00" "#3BFF00" "#4EFF00" "#62FF00" "#76FF00"
 [8] "#89FF00" "#9DFF00" "#B1FF00" "#C4FF00" "#D8FF00" "#EBFF00" "#FFFF00"
> (y <- rgb(r=0,g=.5,b=seq(0,1,length.out=14)))
 [1] "#008000" "#008014" "#008027" "#00803B" "#00804E" "#008062" "#008076"
 [8] "#008089" "#00809D" "#0080B1" "#0080C4" "#0080D8" "#0080EB" "#0080FF"
> 
> jpeg("rgbcolorspace.jpg")
> layout(1:2)
> par(mai=c(.8,.1,.4,.4))
> barplot(dat,horiz=TRUE,col=x,xaxt="n",main="rgb(r=seq(0,1,length.out=14),g=1,b=0)")
> gridtext(label=x,at=cumsum(dat)-.5,rot=-60)
> 
> barplot(dat,horiz=TRUE,col=y,xaxt="n",main="rgb(r=0,g=.5,b=seq(0,1,length.out=14)")
> gridtext(label=y,at=cumsum(dat)-.5,rot=-60)
> dev.off()

で、こんな感じ。

僕の場合は、rgb関数が一番理解しやすい。