R: colorspaceパッケージを用いたインタラクティブなプロットカラーの設定

こんにちは、エンヂニアです。

今日はRにおける、colorspaceパッケージを用いたインタラクティブなカラーの設定について簡単な備忘録的投稿をしたいと思います。

データサイエンティストでもなんでもなく、正直仕事上もそれ程データサイエンスを実践しているわけでもない、Rの趣味的カジュアルユーザーであるエンヂニアにとって、なかなかとっつきにくかったのがこの色・カラーの設定。

仕事上のデータの分析・Visualisationについては、エクセルやSpotfireといったGUIツールがメインなので、Rではインタラクティブに色を変えられないのが非常に苦痛でした。色をちょこちょこ変えながらグラフ・チャートがどうなるか随時チェックしつつ最適な色の組み合わせを見つけるのが楽チンですよね。

もちろん、Rに慣れるに従って、好みの色のコーディングの仕方を覚えてくるわけで、そうなると逆にカチカチクリックしてマニュアルで色を変えなければならないのが億劫になり、短いコードでばちっと設定できる威力・ありがたみが分かってくるんですが、そのレベルにたどり着くまでの道程を、このcolorspaceパッケージが助けてくれると思います。

ここでは、次のような手順を踏みたいと思います。

  1. 適当にデータを生成
  2. 同データの平滑化曲面プロットを作成
  3. カラーパレットを作成
  4. 同プロットのカラーを設定

尚、カラーパレットとは、複数の色が1セットになったもので、Rのプロットのカラー設定引数に設定することができます。代表的なカラーパレット集を提供するRColorBrewerパッケージについては以下のサイトが参考になると思います。この”Standard”を理解することで、自分でカラーパレットを作成できるcolorspaceパッケージの便利さもより分かりやすくなるのではないでしょうか。

RColorBrewerは便利でよく使われるパッケージです。色々な色の組み合わせを簡単に使うことができます。しかし、複数のグラフを重ねたときに、透過度を簡単に設定できないのは使いにくく感じる場合があります。

1. データ生成

それでは早速サンプルコードを見て行きましょう。

### 必要なパッケージをインストール
require("colorspace")
require("lattice")       #プロットに使用
require("latticeExtra")  #プロットに使用


### 必要なパッケージを読み込み
library(colorspace)
library(lattice)
library(latticeExtra)


### プロットに使用するデータを100点作成
### 2次元平面上の地点(x, y)においてある測定値zが存在
x <- rnorm(100)
y <- rnorm(100)
z <- y * 2 + rnorm(100)


### x, y, zをまとめてxyz データフレームを作成
xyz <- data.frame(X = x, Y = y, Z = z)


### どんななデータでもまずはデータの理解が第一歩
### ここでは単純にペアプロットを作成
plot(xyz)

2. 平滑化曲面プロットを作成

続いて、上述データの平滑化曲面プロットを作成します。本投稿のテーマはプロットの色の設定ですのでもちろんこのプロットはなんでもよいのですが、多少見栄えもよいということで平滑化プロットを選びました。

今回はlatticeパッケージのlevelplot関数及びlatticeExtraパッケージのlayer_関数を使用します。

### latticeパッケージのlevelplot関数を用いて平滑化曲面プロットを作成
### まずはデフォルトカラー
levelplot(z ~ x * y, xyz, panel = panel.levelplot.points, 
          points = TRUE, cex = 1.2) + 
  layer_(panel = panel.2dsmoother(..., n = 100))

ちょっと脱線しますが、layer_関数の引数panelpanel.2dsmootherを指定することで、データに基づいてLOESS(若しくはLOWESS)法を用いた平滑化曲面が生成されます(デフォルト)。

以下に、白旗慎吾等による「統計学辞典」による同手法の説明を抜粋させてもらいました。

データに滑らかな曲線や曲面を当てはめるコンピュータ集約的手法。Local RegressionまたはLocally Weighted Regression and Smoothing Scatterplotからこう呼ばれる。この手法では、遠い点の重みを小さくする重み付き最小2乗法を使って、多項式(通常は直線化2次関数)をデータの局所的な部分集合に当てはめる。LOESSは、事前にデータ全体にはモデルを要求せず、したがって平滑化された値に陽な式を与えない。

白旗慎吾 他著「統計学辞典」共立出版

AmazonでGraham Upton, Ian Cook, 白旗 慎吾, 内田 雅之, 熊谷 悦生, 黒木 学, 阪本 雄二, 坂本 亘の統計学辞典。アマゾンならポイント還元本が多数。Graham Upton, Ian Cook, 白旗 慎吾, 内田 雅之, 熊谷 悦生, 黒木 学, 阪本 雄二, 坂本 亘作品ほか、...

3. カラーパレットの作成

さて、本題に戻って、colorspaceパッケージのchoose_palette関数を使って自分好みのカラーパレットを作成して、プロットのカラーを変更・設定して行きたいと思います。

以下のコードを実行します。

mycol <- choose_palette()

すると、以下の様なウィンドウをが現れます。

色々と設定するパラメータがあって且つ英語表記ですが、どれもいじってみることで非常に直感的に理解できる物ばかりです。習うより慣れろですね。

この様に、インタラクティブに色の設定を行えるところが気に入ってます。

さて、ひとしきりいじってみて好みの、プロットに合ったカラーパレットができたら、”OK”ボタンを押して同ウィンドウを閉じます。

次いで、次のコマンドを実行します。

mycol

すると、以下の様なちょっと複雑そうな出力を得ます。

function (n, h = c(168, 330), c = 100, l = c(19, 92), power = 1.5, 
    fixup = TRUE, gamma = NULL, alpha = 1, ...) 
{
    if (!is.null(gamma)) 
        warning("'gamma' is deprecated and has no effect")
    if (n < 1L) 
        return(character(0L))
    h <- rep(h, length.out = 2L)
    c <- c[1L]
    l <- rep(l, length.out = 2L)
    power <- rep(power, length.out = 2L)
    rval <- seq(1, -1, length = n)
    rval <- hex(polarLUV(L = l[2L] - diff(l) * abs(rval)^power[2L], C = c * abs(rval)^power[1L], H = ifelse(rval > 0, h[1L], 
            h[2L])), fixup = fixup, ...)
    if (!missing(alpha)) {
        alpha <- pmax(pmin(alpha, 1), 0)
        alpha <- format(as.hexmode(round(alpha * 255 + 1e-04)), 
            width = 2L, upper.case = TRUE)
        rval <- paste(rval, alpha, sep = "")
    }
    return(rval)
}

え、なんかこれ全然簡単じゃないじゃん。。。と思われた方、ご心配なく、重要なのは青太字部分のみで、これが、次の段階で使用する自作カラーパレットの情報となります。

4. プロットのカラーを設定

いよいよプロットの色を、自作カラーパレットに変更・設定します。

mypal <- diverge_hcl(n = 50, h = c(168, 330), c = 100, l = c(19, 92), 
                     power = 1.5, fixup = TRUE, gamma = NULL, alpha = 1)
levelplot(z ~ x * y, xyz, panel = panel.levelplot.points, 
          points = TRUE, cex = 1.2, col.regions = mypal) + 
  layer_(panel = panel.2dsmoother(..., n = 100))

diverge_hcl関数の引数ですが、これが前工程青地コピペですね。引数nは色の分割数で、これは手入力になります。

levelplot関数の場合は、色の設定はcol.regions引数を用いますが、その他のプロット関数を使う場合も同じ様に、色の設定引数にカラーパレット変数を渡してあげればよい訳です。

ここではdiverge_hcl関数を用いましたが、これは、choose_palette関数のウィンドウの”The nature of your data”の設定に”Diverging”を選んだからです。

同設定にその他の選択肢を選んだ場合に使用すべきパレット関数を次の通りまとめておきます(こちらより)。

The nature of your data パレット関数
Qualitative rainbow_hcl
Sequential (single hue) sequential_hcl
Sequential (multiple hues) heat_hcl
Diverging diverge_hcl

パレット関数毎に引数セットが少しずつ違いますが、いずれを選んだ場合でも上記の様にコピペできますので簡単ですね。

今日は以上になります!

参考サイト

  1. https://www.nceas.ucsb.edu/~frazier/RSpatialGuides/colorPaletteCheatsheet.pdf
  2. https://cran.r-project.org/web/packages/colorspace/colorspace.pdf
  3. https://cran.r-project.org/web/packages/latticeExtra/latticeExtra.pdf
  4. https://cran.r-project.org/web/packages/lattice/lattice.pdf


今日も最後までお付き合い頂きありがとうございます。↓ポチッとクリックして下さったら尚感謝です。

にほんブログ村 海外生活ブログ オーストラリア情報へ

にほんブログ村

シェアする

  • このエントリーをはてなブックマークに追加

フォローする