ほくそ笑む

R言語と統計解析について

R で Excel っぽい色を出す

仕事をしていると思いもよらない要求がお客さんから出たりするものです。
先日、あるグラフをお客さんに提出したところ、「色がカラフルすぎる。Excel っぽい地味な色にしてほしい」という要求が出ました。
そういえば R が生成する色って原色系が多いのかなーと思ったり。
例えば rainbow() はこんな感じの色を出してくれます。

n <- 20
pie(rep(1, n), col=rainbow(n), clockwise=TRUE, border=NA, labels=NA, lty=0)


確かにカラフルです。
で、Excel で同じものを描くと

地味です。
お客さんも「絶対 Excel っぽくしてほしい」というわけではなかったのですが、面白そうだったので R で Excel っぽい色を出す関数を作ってみました。

excel.like.color <- function(n) {
  n <- as.integer(n)
  if(is.na(n) || length(n) != 1 || n < 0) {
    stop()
  } else if(n == 0) {
    return(character(0))
  }
  BLUE <- c(69, 114, 167)
  RED <- c(170, 70, 67)
  GREEN <- c(137, 165, 78)
  PURPLE <- c(113, 88, 143)
  LIGHTBLUE <- c(65, 152, 175)
  BROWN <- c(219, 132, 61)
  
  base.colors <- matrix(c(BLUE, RED, GREEN, PURPLE, LIGHTBLUE, BROWN), nrow=3)
  residue <- (n - 1) %% 6 + 1
  quotient <- floor((n - 1) / 6)
  
  if(quotient == 0) {
    rgb <- as.matrix(base.colors[, 1:residue])
    return(rgb(rgb[1,], rgb[2,], rgb[3,], 1, maxColorValue = 255))
  }
  
  result <- character(n)
  for(i in 0:(quotient-1)) {
    for(j in 1:6) {
      a <- (220 - base.colors[, j]) / (quotient + 1)
      rgb <- a * i + base.colors[, j]
      result[i * 6 + j] <- rgb(rgb[1], rgb[2], rgb[3],  maxColorValue = 255)
    }
  }
  
  for(j in 1:residue) {
    a <- (220 - base.colors[, j]) / (quotient + 1)
    rgb <- a * quotient + base.colors[, j]
    result[quotient * 6 + j] <- rgb(rgb[1], rgb[2], rgb[3],  maxColorValue = 255)
  }
  
  result
}

これで、さきほどの円グラフを描いてみると

n <- 20
pie(rep(1, n), col=excel.like.color(n), clockwise=TRUE, border=NA, labels=NA, lty=0)


おおー、Excel っぽい!
というわけで、無事お客さんに Excel っぽいグラフを提出することができました。
しかしまあ、このプログラムはたぶん2度と使う機会は無いだろうなー。
ということで、きれいなプログラムではないですが、お蔵入りするのはもったいないので公開しておきます。
R で Excel っぽい色を出したい方、上記プログラムを参考にどうぞ。
以上です。

追記

マイクロソフトのことだから、このへんのことも考えての配色なんだろうな〜と思います。
もう少し調査してみるとおもしろいかも。