viridisの色数

カテゴリ: r

viridiscividis は、色の変化が知覚的に一様となるよう調整された、連続的なカラースケール。白黒印刷するとグレースケールになるので、プリンタにも優しい。

viridis は論文がなさそうだが、 cividis は論文にもなっているようだ (https://arxiv.org/ftp/arxiv/papers/1712/1712.01662.pdf)。

これらはカラフルらしいのだが、見た目としてカラフルなだけではなく、階調としてもカラフルなのか気になったので調べることにした。

viridisってカラフル?

少なくとも見た目にはカラフルだ.

library(ggplot2)
qplot(x=0:255, y = 1, fill = 0:255, geom = "raster", show.legend = FALSE) +
  scale_fill_viridis_c() +
  theme_void() +
  theme(plot.margin = unit(rep(-9, 4), "mm"))

何色あるんだろう?

viridisは色の変化が知覚的に一様 (perceptually uniform) であるよう、 CIELAB空間で色を変化させている。多分、色空間を真面目に調べれば、CIELAB空間上のviridisをRGBに直した時、最大何色利用できるかは数理的に決定できる。

しかし、めんどくさいので、とりあえずシミュレーションしてみた。

1 - 255 階調までは色の数も 1:1 に単調増加。以降は振動しつつ、650色程度で飽和するようだ。

library(scales)
library(ggplot2)
library(magrittr)

# viridisを作るための基本色を用意
v <- viridis_pal(1,0,1,1,"D")(6)

n <- seq(1:5e3)

# 0から1をn当分し、それぞれの値に対応するviridisを
# gradient_n_palを用いて用意する。
# 生成された色の数をuniqueとlengthを使って数える。
# これをnを変えながら行う。
colors <- lapply(n, function(n) seq(0, 1, length = n)) %>%
  lapply(gradient_n_pal(v)) %>%
  lapply(unique) %>%
  sapply(length) 

# プロット
ggplot(data.frame(n, colors), aes(n, colors)) +
  geom_abline(slope = 1, intercept = 0, color = "red", lty = "dashed") +
  geom_line()