Help us understand the problem. What is going on with this article?

Rでカラーパレット作成

More than 3 years have passed since last update.

毎回忘れてはググるので未来の自分へ。

参考となる資料

たぶんこれらをおさえておけば、基本的に大丈夫。

Rに組み込まれてるカラーパレット

省略します。上述の参考資料を見てください。

カラーパレットの自作

grDevices::colorRamp()もしくはgrDevices::colorRampPalette()で作成可能。詳しくはそれぞれのヘルプ参照。

colorRamp()によるカラーパレット作成

例えば、「赤・黄色・緑・青」と変化していくカラーパレットを作成するなら、以下の通り:

colPal1 <- colorRamp(c("red", "yellow", "green", "blue"), space = "rgb")

まず、このcolPal1関数となります:

colPal1

## function (x) 
## roundcolor(cbind(palette[[1L]](x), palette[[2L]](x), palette[[3L]](x), 
##     if (alpha) palette[[4L]](x))) * 255
## <bytecode: 0x2d3b098>
## <environment: 0x2d3c3d0>

colorRamp()で作成したカラーパレットは、引数にx[0,1]の範囲の実数値ベクトルを与えます。試しにc(0, 0.2, 0.4, 0.6, 0.8, 1)でやってみます:

colPal1(c(seq(0, 1, by = 0.2)))

##      [,1] [,2] [,3]
## [1,]  255    0    0
## [2,]  255  153    0
## [3,]  204  255    0
## [4,]   51  255    0
## [5,]    0  153  102
## [6,]    0    0  255

生成されるのは、レコード(行)にRGBの値を格納したデータです。よって、「このカラーパレット作成した時に指定した色の順番がセット」され、「カラーパレットに値を放り込めば、その分位点での色を自動的に持ってくる」みたいなことをしてくれます。分位点で指定したいならこれが楽ですが、「n個で切り分けてくれ」という場合には、colorRampPalette()を使ったほうが楽です。

colorRampPalette()によるカラーパレット自作

考え方は上述のcolorRamp()とほぼ同じです。「赤・黄色・緑・青」と変化していくカラーパレットを作成するなら、以下の通り:

colPal2 <- colorRampPalette(c("red", "yellow", "green", "blue"))

このcolPal2もやはり関数となります:

colPal2

## function (n) 
## {
##     x <- ramp(seq.int(0, 1, length.out = n))
##     if (ncol(x) == 4L) 
##         rgb(x[, 1L], x[, 2L], x[, 3L], x[, 4L], maxColorValue = 255)
##     else rgb(x[, 1L], x[, 2L], x[, 3L], maxColorValue = 255)
## }
## <bytecode: 0x19d51a0>
## <environment: 0x1dc9fb8>

colorRampPalette()で作成したカラーパレットは、引数に正の整数値を与えます。試しに6でやってみます:

colPal2(6)

## [1] "#FF0000" "#FF9900" "#CBFF00" "#32FF00" "#009866" "#0000FF"

こちらはこの手の書式のベクトルで返ってきます。なんでこんな処理の違いが出てくるかは、それぞれの関数のソースコードを眺めたらつかめると思います(短いです)。分割数を指定したいならばこれが自動的にやってくれますので楽です。

RColorBrewerの色数をもっと細かく増やしたい

RColorBrewerは大変便利なのですが、色数は一番多いカラーパレットでも12です。これを13以上にするにはどうすればいいでしょうか。

RColorBrewerの使い方

RColorBrewerは、大雑把にいうとColorbrewerのサイトで提案されているカラーパレットをピックアップしてRで簡単に呼び出せる、ようにしたものです。まず、どんなカラーパレットが含まれているかを一覧させてみます:

library(RColorBrewer)
display.brewer.all()

unnamed-chunk-7-1.png

ではこの中から"Spectral"というカラーパレットで、7色取り出してみます。色を取り出すにはRColorBrewer::brewer.pal()です:

brewer.pal(11,"Spectral")

##  [1] "#9E0142" "#D53E4F" "#F46D43" "#FDAE61" "#FEE08B" "#FFFFBF" "#E6F598"
##  [8] "#ABDDA4" "#66C2A5" "#3288BD" "#5E4FA2"

ではこれがどんな色かを確認します。サンプルを表示させるにはRColorBrewer::display.brewer.pal()です:

display.brewer.pal(11,"Spectral")

unnamed-chunk-9-1.png

よって、使いたいカラーパレットを探し、brewer.pal()で指定すれば色を取得できるんですね。

RColorBrewerの色数対応を増やしたい

ここまでくれば、おそらく察しがつくかと思います。

  1. brewer.pal()を利用して、使いたいカラーパレットの色を取り出す
  2. 1.で取り出した色セットをColorRamp()もしくはColorRampPalette()でカラーパレットにする
  3. 作成したカラーパレットに適切な引数を与えて色を指定

これでOKです。試しに{plotly}でやってみます:

library(plotly)
library(dplyr)

df <- data.frame(cat = sample(paste0("cat", LETTERS[1:15]), size = 1000, replace = TRUE),
                 value = rnorm(n = 1000, mean = 50, sd = 10)
                 ) %>% 
  arrange(cat)

colPal3 <- colorRampPalette(brewer.pal(11, "Spectral"))
plot_ly(df, x=cat, y=value, color=as.ordered(cat), colors = colPal3(length(unique(df$cat))), type = "box")

unnamed-chunk-10-1.png

ここまで把握すればたぶん大丈夫ではないかと思います。

自作カラーパレットの色選び

センスが必要です。私には無理なので「色選択 デザイン」とかで適当にググッて探してください。

Enjoy!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away