今回は「Rとウェブの融合」最終回ということでggvis
パッケージを紹介します。
ggvis
パッケージはRStudioのWinston Chang氏が中心となって開発している比較的新しい可視化パッケージで、現在もアクティブに開発が進められています。
“Grammer of Graphics"というggplot2
の可視化手法を継承していて、
ウェブブラウザ上での可視化、shiny
をベースとしたインタラクティブなグラフの操作など、これまでのRによる可視化の概念を覆すポテンシャルを秘めています。
簡単な利用例を以下にいくつか示します(図1)。 グラフを作成すると、RStudio上ではViewerパネルに、R GUI上では既定のウェブブラウザにグラフが表示されます。 グラフ右上の歯車アイコンをクリックすると、SVG形式またはPNG形式によりグラフを画像として保存できます。 またグラフ右下のパーツをドラッグするとグラフの大きさを変更できます。 インタラクティブな操作を含む動的可視化の場合はR上で可視化処理が継続されて他のコマンドを受け付けなくなります。 動作を止めるにはRコンソール上でエスケープキーまたはCtrl+Cを押して下さい。
> install.packages("ggvis") # 必要ならインストール
> library(ggvis)
>
> # 散布図
> mtcars %>%
+ ggvis(~mpg, ~wt, fill = ~factor(cyl)) %>%
+ layer_points()
>
> # 箱ひげ図
> mtcars %>%
+ ggvis(~factor(cyl), ~wt, fill = ~factor(cyl)) %>%
+ layer_boxplots()
>
> # ヒストグラム
> data.frame(x = rnorm(1000)) %>%
+ ggvis(~x) %>%
+ layer_histograms() %>%
+ add_axis("x", title="value", ticks=5)
ggvis
パッケージには豊富なデモが添付されているので、まずはデモを動かしてみることをお勧めします。
> demo(package="ggvis") # 利用できるデモ一覧
> demo(lines) # 折れ線グラフのデモ
ggvis
パッケージはパイプ演算子%>%
によるチェイン構文を採用しています。基本的な構文は次のような形式となります。
> data %>% # データ
+ ggvis(x = ~var1, ...) %>%
+ layer_XXX(...) %>% # グラフの種類の指定
+ ...
data
には可視化したいデータ(データフレーム形式)を指定します。
データの次にggvis()
関数をつなげます。
ggvis()
ではグラフ中の各属性(x/y/色など)に対応する値や変数名を指定できます。
layer_XXX(...)
はグラフの種類(レイヤ)を指定する関数です。
layer_XXX()
関数の中でも属性に対応する値や変数名を指定できますが、
ggvis()
での属性指定は全てのレイヤに共通の既定値となるのに対し、layer_XXX()
での指定はそのレイヤのみに適用されます。
これ以外にも軸や凡例の調整、スケール指定などの関数をつなげることで、ggvis
オブジェクトをカスタマイズできます。
ggvis()
やlayer_XXX()
ではグラフ中の属性に対して、データ中の変数または固定値を指定することができます。
変数を指定するには例えばx = ~mpg
のように属性 = ~変数名
という形式を用います。
固定値を指定するにはfill := "red"
のように属性 := 固定値
という形式を用います。
またデータ内に描画色などの属性値を直接指定する変数がある場合には、属性:=~変数名
とします。
次の例では点の形状に固定値(四角)を、描画色にデータ中の値(変数f
)を指定しています(図2左)。
> df = data.frame(d = 1:3, e = 3:1, f = c("red", "green", "blue"))
> df %>% ggvis(x=~d, y=~e, shape:="square", fill:=~f) %>%
+ layer_points()
layer_XXX()
関数により様々なグラフを描画できます。代表的なグラフの種類は次の通りです。
各グラフの色や形などの属性をggvis()
関数または各layer_XXX()
関数内で指定する必要があります。
必須属性はグラフの種類によって異なるので、?layer_bars
などとしてヘルプファイルを参照して下さい。
関数名 | 説明 |
---|---|
layer_bars |
棒グラフ |
layer_boxplots |
箱ひげ図 |
layer_freqpolys |
頻度のプロット |
layer_histograms |
ヒストグラム |
layer_lines |
折れ線グラフ |
layer_paths |
パスの描画 |
layer_points |
点グラフ・散布図 |
layer_ribbons |
リボングラフ |
layer_smooths |
線形・非線形回帰 |
layer_text |
文字列のプロット |
複数のlayer_XXX()
関数をチェインにつなげることで、異なる種類のグラフを重ねて描画することも可能です。次の例では点と回帰曲線を重ねてプロットしています(図2中)。
> mtcars %>%
+ ggvis(~mpg, ~wt) %>%
+ layer_points() %>% layer_smooths()
ggvis
パッケージではgroup_by()
関数をチェインさせることでデータをグループ化してプロットできます。
またdplyr
パッケージのmutate()
関数をチェインさせることでプロット作成中にデータの値を変更できます。
次の例では、まずcyl
変数を因子化して、disp
変数をリットル単位に変更しています。
次にggvis()
で属性と変数のマッピングを行った後に、group_by()
でcyl
変数によりグループ化しています(図2右)。
グループ化の効果によりグループごとにそれぞれ非線形回帰が行われています。
> mtcars %>%
+ dplyr::mutate(cyl = factor(cyl), disp = disp / 61.0237) %>%
+ ggvis(~mpg, ~disp, fill=~cyl, stroke=~cyl) %>%
+ group_by(cyl) %>%
+ layer_points() %>% layer_smooths()
軸及び凡例の調整にはadd_axis()
及びadd_legend()
関数を用います。
例えばx軸のタイトルを指定するにはadd_axis("x", "タイトル")
をggvis
オブジェクトに適用します。
なお軸及び凡例を非表示にするにはhide_axis()
及びhide_legend()
関数を用います。
次の例ではX軸を非表示とし、Y軸や色の凡例を調整しています(図3左)。
> mtcars %>%
+ ggvis(~mpg, ~wt, fill = ~factor(cyl)) %>%
+ layer_points() %>%
+ hide_axis("x") %>%
+ add_axis("y", title = "重さ", ticks = 5) %>%
+ add_legend("fill", title = "シリンダ数", orient="left")
ある変数の値がどの位置に描画されるか、どの色で描画されるか、など、
「値」と「見た目」のマッピングを「スケール」と呼びます。
ggvis
パッケージはスケールを自動的に計算しますが、scale_XXX
関数をチェインにつなげることで手動で調整することもできます。
連続値をとる変数のスケールを調整するにはscale_numeric
、離散値をとる変数にはscale_nominal
を用います。
次の例ではX軸のスケールを反転させて範囲を0から50に変更しています。また色のスケールでは描画色を指定しています(図3中)。
> mtcars %>%
+ ggvis(~mpg, ~wt, fill = ~factor(cyl)) %>%
+ layer_points() %>%
+ scale_numeric("x", reverse=TRUE, domain = c(0, 50)) %>%
+ scale_nominal("fill", range = c("red", "green", "blue"))
ggvis
パッケージでは作成したグラフをインタラクティブに操作することができます。
add_tooltip()
関数をチェインにつなげることでグラフ中の値をポップアップ表示できます(図3右)。
add_tooltip()
関数の第一引数にはポップアップのフォーマットを指定する関数を渡します。
> mtcars %>%
+ ggvis(~mpg, ~wt) %>%
+ layer_points() %>%
+ add_tooltip(function(x) paste(x, collapse=" / "))
さらにggvis
パッケージではshiny
の仕組みを利用してインタラクティブに属性や変数の範囲を指定することができます。
ggvis()
関数やlayer_XXX()
関数内での属性に対して変数名や値を指定するかわりに、動的に値を決めるためのinput_XXX()
関数を指定します。
次の例ではヒストグラムの描画色とビン幅を操作できるようにしています(図4)。
> data.frame(x = rnorm(1000)) %>%
+ ggvis(~x, fill:= input_select(c("red", "blue", "green"))) %>%
+ layer_histograms(width = input_slider(0.01, 3, 0.1, 0.01, label="ビン幅"))
最後に紹介したshiny
ベースのインタラクティブな操作など、ggvis
パッケージは巨大なデータの探索的解析に役立つこと間違いありません。
これまで7回に渡り「Rとウェブの融合」と称してRとウェブに関連する新しい技術を紹介してきました。 今後もウェブをプラットフォームとしたデータ解析という流れは益々盛んになることでしょう。 Rはオープンな環境でありRからウェブ技術を簡単に利用するための便利なツールが日々開発されています。 本連載をきっかけとして統計解析をメインタスクとする読者の皆様にウェブ技術に興味を持ってもらい日々の業務に活かされれば著者冥利に尽きます。