r-wakalangの#r-beginner部屋でこのあたりの内容をみて、確認してみたくて勝手にやりました。

データ準備

df1 <- data.frame(
  category = rep(paste0("cat", LETTERS[1:13]), 4),
  values = sample(1:100, 52),
  week = sort(rep(1:4,13))
)

plotlyのカラーパレットについて

plot_ly()color=に指定するカテゴリカル変数は、そのまま渡すと9以上カテゴリがあるとエラーが出る。たぶんどうもデフォルトのカラーパレット(RColorBrewerの“Set2”)が8しかなくて、最初はこれを読み込むからっぽい。でもちゃんとカラーパレットは引き渡される。謎。

エラーがじゃまなら、color=as.ordered(hoge)とすると消える。内部のfactor型の処理で、条件分岐で微妙なところがあるんかなぁ…。

ともかく、Rの他のグラフィック同様、カラーパレットをそのままcolors=に引き渡せばOKです。詳しくはplotlyの本家ドキュメントのこのあたりを参照してください。

自作カラーパレットでのテスト

このあたりについては、三重大学の奥村先生のこの説明が参考になります。

下のコードでは、青・緑・黄色・赤の4色からなるカラーパレットをgetPalette()関数として準備します。function使わずに関数になっているのは、colorRampPalette()の返り値が関数だからです。

library(plotly)
## Loading required package: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:graphics':
## 
##     layout
getPalette = colorRampPalette(c("blue", "green", "yellow", "red"))
plot_ly(
  df1,
  x = week,
  y = values,
  line = list(shape = "linear"),
  color = as.ordered(category),
  colors = getPalette(13)
)

他にも、RColorBrewerパッケージのあのパレット群も使えます。詳しくは上記奥村先生による説明もしくは?brewer.palで確認してください。

library(RColorBrewer)
getPalette2 = colorRampPalette(brewer.pal(9, "BrBG"))
plot_ly(
  df1,
  x = week,
  y = values,
  line = list(shape = "linear"),
  color = as.ordered(category),
  colors = getPalette2(13)
)

カラーパレットの作り方自体はplotlyに限ったものじゃなく、Rのグラフィックのお話になるはず。カラーパレットの適用についてはそれぞれのギラフィック用関数やパッケージによると思いますが…。

Enjoy!!

参考資料