ggvisでインタラクティブな凝った可視化をする

この記事はR Advent Calendar 2015の9日目の記事です。

ggvisパッケージを使ってちょっとだけ凝った可視化をしてみたので、その備忘録&情報共有です。
内容としては

  • (適当な)予測モデルを作って
  • 予測値からの実際のずれが上に(下に)大きいほど、描画される点が赤く(青く)なる
  • 描画されている各点を押下するとポップアップが出て、元データの情報が表示される

というものです。

結果は

なかんじ。
下にあるコードをコピペするとplot欄に描画結果がでるので、その各点をクリックすると、各点を推定するのに使ったirisデータがポップアップしてきます。

コード上の注意としては

  • add_tooltip関数内では、描画に必要なデータ(ここではpredictとcorrectとcolor)しか渡ってこない
  • 従って、元データなどの情報を取る場合には、layer_points(key:=~id) のようにkeyとid(自作)を指定し追加で渡ってくる変数(key)を作成
  • add_tooltip関数内ではそのidをキーに外にあるデータを引く

という構成にする必要があるということです。

library("ggvis")
library("stringr")
#青・赤色に対応したクロージャを作成する
color_low  <- colorRampPalette(c("lightblue", "darkblue"))
color_high <- colorRampPalette(c("red1", "yellow"))
#適当な予測モデルを作る(ここではirisを適当に線形回帰)
value_predict <- predict(lm(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width, data=iris))
value_correct <- iris$Sepal.Length
#元データなどの結果をdata.frameに格納
df <- data.frame(
  id=1:nrow(iris),
  predict=value_predict, 
  correct=value_correct, 
  valuation=value_predict-value_correct)
#対応する色を割り当てる
df$color <- NA
index <- df$valuation >= 0
df$color[index] <- as.character(cut(df$valuation[index], seq(0, max(df$valuation)+0.01, length.out=11), labels=color_low(10)))
index <- df$valuation < 0
df$color[index] <- as.character(cut(df$valuation[index], seq(min(df$valuation)-0.01, 0, length.out=11), labels=color_high(10)))
#ggvisによる描画
df %>%
  ggvis(~predict, ~correct, fill:=~color) %>%
  layer_model_predictions(formula=correct~predict-1, model="lm") %>%
  layer_points(key:=~id) %>%
  add_tooltip(
    function(x){
      row <- which(df$id == x$id)
      str_c(names(iris)[2:4], iris[row,2:4], sep=":", collapse=" ")
    }, "click") 

Enjoy!!!