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!!!