Rとウェブの融合(7)ーggvisパッケージー

今回は「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)

図1: 基本的なプロット例

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()

図2: プロット例(1)

軸と凡例の調整

軸及び凡例の調整には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=" / "))

図3: プロット例(2)

さらに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="ビン幅"))

図4: インタラクティブな操作

最後に紹介したshinyベースのインタラクティブな操作など、ggvisパッケージは巨大なデータの探索的解析に役立つこと間違いありません。

これまで7回に渡り「Rとウェブの融合」と称してRとウェブに関連する新しい技術を紹介してきました。 今後もウェブをプラットフォームとしたデータ解析という流れは益々盛んになることでしょう。 Rはオープンな環境でありRからウェブ技術を簡単に利用するための便利なツールが日々開発されています。 本連載をきっかけとして統計解析をメインタスクとする読者の皆様にウェブ技術に興味を持ってもらい日々の業務に活かされれば著者冥利に尽きます。