Edited at

連続量データに対するグラデーションのある色付け

More than 3 years have passed since last update.

ちょっとハマったのでメモ。

色々やってみたけど、smoothPaletteが楽だった。


方法1 : 値の並び順に色を対応させる

# 一様分布の乱数

test_unif <- runif(1000)
# 正規分布の乱数
test_norm <- rnorm(1000)

color_unif1 <- cm.colors(length(test_unif))
color_unif1 <- color_unif1[rank(test_unif)]

color_norm1 <- cm.colors(length(test_norm))
color_norm1 <- color_norm1[rank(test_norm)]

# 一様分布
png(file="Unif1.png")
plot(test_unif, col=color_unif1, pch=16, ann=F)
dev.off()
# 正規分布
png(file="Norm1.png")
plot(test_norm, col=color_norm1, pch=16, ann=F)
dev.off()

Unif1.png

Norm1.png

一様分布しているようなデータなら、このやり方でもいいかもしれないが、山なりの分布になるようなデータの場合、山の部分に中間色が集中して、それ以外は強い色になってしまう。

並び順ではなく値の大小と色を対応させたい。


方法2 : smoothPaletteで値の大小と色を対応させる

library("tagcloud")

color_unif2 <- smoothPalette(-test_unif, pal="RdBu")
color_norm2 <- smoothPalette(-test_norm, pal="RdBu")

# 一様分布
png(file="Unif2.png")
plot(test_unif, col=color_unif2, pch=16, ann=F)
dev.off()
# 正規分布
png(file="Norm2.png")
plot(test_norm, col=color_norm2, pch=16, ann=F)
dev.off()

Unif2.png

Norm2.png

このやり方だと、簡単に値と色が対応する。

ただし、smoothPaletteが対応しているpal(例 : YlOrRdとかSpectralとか)しか対応していない。

例えば、RdBuは小さい値が赤、大きい値が青で、感覚と逆で気持ち悪い(smoothPalette(-test_unif, pal="RdBu")で逆転させたが)。

どの色からどの色へと変化させるかも自分で自由に定義したい。


方法3 : palfuncを指定する(colorRampPaletteの返り値を渡す)

color_unif3 <- smoothPalette(test_unif, palfunc=colorRampPalette(c("skyblue", "gray", "pink")))

color_norm3 <- smoothPalette(test_norm, palfunc=colorRampPalette(c("skyblue", "gray", "pink")))

color_unif4 <- smoothPalette(test_unif, palfunc=colorRampPalette(cm.colors(12), alpha=TRUE))
color_norm4 <- smoothPalette(test_norm, palfunc=colorRampPalette(cm.colors(12), alpha=TRUE))

# 一様分布
png(file="Unif3.png")
plot(test_unif, col=color_unif3, pch=16, ann=F)
dev.off()
# 正規分布
png(file="Norm3.png")
plot(test_norm, col=color_norm3, pch=16, ann=F)
dev.off()

# 一様分布
png(file="Unif4.png")
plot(test_unif, col=color_unif4, pch=16, ann=F)
dev.off()
# 正規分布
png(file="Norm4.png")
plot(test_norm, col=color_norm4, pch=16, ann=F)
dev.off()

Unif3.png

Norm3.png

Unif4.png

Norm4.png

これなら、自分な好きな色を始点、中間点、終点に指定して書ける。

参考

http://www.inside-r.org/packages/cran/tagcloud/docs/smoothPalette

http://stat.biopapyrus.net/graph/rcolorbrewer.html

http://www.slideshare.net/takehisayamakita/rainbowrcolorbrewercolorramppalette