Rとウェブの融合(3)ーrChartsの応用例ー

前回、前々回と「Rとウェブの融合」としてrChartsについて紹介しました。rChartsでは前回紹介したHighcharts以外にも様々なライブラリを利用できます。 rChartsの基本的な使い方は前回解説した通りですが、利用できるオプションなどはライブラリによって多少異なります。 今回はそれぞれのライブラリの特徴について紹介していきます。

Polychart

Polychartはggplot2にも採用されているGrammer of Graphicsという可視化コンセプトをベースとしたライブラリです。 デモサイト( http://www.polychart.com/js/demo )には様々なグラフ例が紹介されています。 折れ線、エリア、散布図、棒グラフ、円グラフなどの基本的なグラフを作成できます。 またファセットという機能を使って、ある要因の水準ごとに複数のパネルにグラフを描画できます。

PolychartのプロットオブジェクトはrPlot()により作成します。 前回のHighcharts同様、引数にはデータ(データフレーム形式)、x軸、y軸、色などを指定する変数などを渡します。 プロットの種類はtype引数で指定します。次のようなプロットを利用できます。

point, line, bar, area, path, box, text, tile

また、coordメソッドにより座標系を指定できます。cartesianならデカルト座標、polarなら極座標となります。パイチャートの作成には極座標を使います。

次の例ではファセット(フォーミュラ式の|を用いて指定します)を作成して、点の色と大きさを指定した散布図を作成しています(図1左)。

> library(rCharts)
> p <- rPlot( mpg ~ qsec | am + vs, data = mtcars, color = "cyl", size = "disp", type = "point")
> p

Polychartにはレイヤーというコンセプトが導入されています。layerメソッドにより複数のレイヤーを重ねて描画できます。 次の例では折れ線グラフの上に点を重ねています(図1中)。 またguidesメソッドでX軸とY軸の範囲を指定して、tooltip引数でツールチップを追加しています。

> p <- rPlot( demand ~ Time, data = BOD, type = "line")
> p$layer( demand ~ Time, data = BOD, type = "point",
>   tooltip = "#! function(i) {return '値は' + i.demand + 'です';} !#")
> p$guides(x = list(min = 0, max = 8), y = list(min = 0, max = 30))
> p$set(title = "点と線")
> p

棒グラフの例です(図1右)。棒グラフではposition引数により積み上げ方法を指定できます。stackなら積み上げ、dodgeなら並べます。

> hair_eye <- as.data.frame(HairEyeColor)
> p <- rPlot(Freq ~ Hair | Sex, color = "Eye", data = hair_eye, type = "bar", position = "dodge")
> p

図1: Polychartのプロット例

この他にも色々な要素をカスタマイズできます。デモサイトやAPI ( http://github.com/polychart/polychart2/wiki )、Rpubsのサンプル( http://rpubs.com/kohske/12331 )を参考にして下さい。

Morris.js

Morris.js ( http://morrisjs.github.io/morris.js/ )は時系列データのプロットを得意とするライブラリです。 Morris.jsのプロットオブジェクトはmPlot()により作成します。 プロットの種類はtype引数で指定します。次のようなプロットを利用できます。

Line, Area, Bar, Donut

既定値では折れ線グラフにはスムージングがかかります。スムージングを無効にするには引数smooth = FALSEとします。

ここでは例として3系列の時系列エリアチャートを作成します(図2左)。複数の時系列を表示するには、引数yに変数名を複数指定します。 また、setメソッドのevent引数を指定することで、時系列中のイベントを可視化することができます。この例ではイベント時刻を縦線で表示しています。

> d <- data.frame(x = paste(2001:2010), y1 = runif(10), y2 = runif(10), y3 = runif(10))
> p <- mPlot(x = "x", y = c("y1", "y2", "y3"), data = d, type = "Area")
> p$set(events = paste(c(2004, 2008)), eventStrokeWidth = 10)
> p

これ以外の例についてはRpubsのサンプル( http://rpubs.com/kohske/12406 )などを参考にして下さい。

NVD3

NVD3 ( http://nvd3.org/ )はインタラクティブな操作をサポートとするd3.jsベースのライブラリです。 利用できるプロットの種類は次のドキュメントを参考にして下さい ( http://github.com/novus/nvd3/wiki/Models )。 nv.models.XYZのXYZをtype引数に指定します。但しrChartsでは一部のモデルは利用できません。

時系列範囲を指定できるグラフ

lineWithFocusChartモデルを使うと、時系列中の範囲指定をブラウザ上でマウス操作により行うことができます(図2中)。 上部にデータが、下部に範囲指定用のインターフェースが表示されます。下の部分をマウスでドラッグすると、その範囲のデータが上部に反映されます。 長く複雑な時系列データの一部を探索的に把握したい場合には強力な手法です。

> d <- data.frame(x = 1:100, y = rpois(100, 10))
> p <- nPlot(y ~ x, group = "variable", data = d, type = "lineWithFocusChart")
> p

変数選択コントロールの追加

NVD3ではプロットに表示する変数の選択をブラウザ上で行うことができます。 次の例では散布図を作成して、addFiltersメソッドでフィルタリングに使う変数名を指定しています(図3左)。 またこの例ではブラウザ上のMagnifyボタンをクリックすると、マウスカーソル周辺の領域がズームして表示されるようになります。

> p <- nPlot(disp ~ drat, group = "cyl", data  = mtcars, type = "scatterChart")
> p$addFilters("am")
> p

これ以外の例についてはRpubsのサンプル( http://rpubs.com/kohske/12408 )などを参考にして下さい。

leaflet

leafletライブラリ( http://leafletjs.com/ )では地図データの可視化を行うことができます。 現在、GoogleMapやOpenStreetMapなどによりオンラインでアクセスできる地図データが提供されています。 rChartsからleafletライブラリの機能を利用することで、 ブラウザで操作できる地図データの可視化をR上で作成できます。

プロットオブジェクトはLeaflet$newで作成します。setViewメソッドには地図の中心座標(緯度、経度)とズーム値を指定します。 ズーム値が大きい程、地図は拡大表示されます。 地図の表示範囲やズームは通常の地図サイト同様にブラウザ上でも変更できます。 markerメソッドに対して座標とポップアップ表示の内容を指定することで、地図上にマーカーを追加することができます。

次の例では北海道の領域を表示して、マーカを付け加えています(図3右)。

> p <- Leaflet$new()
> p$setView(c(43.7, 143.5), 7)
> p$marker(c(43.312799, 142.540444), bindPopup = "麓郷")
> p$marker(c(43.770636, 142.364819), bindPopup = "旭川")
> p$marker(c(44.021876, 145.18962), bindPopup = "羅臼")
> p

なお、leafletライブラリにはこれ以外にも様々な利用法がありますが、 現状ではrChartsではleafletライブラリの機能をフル活用できません(色々なオプションをjavascriptスクリプトとして埋め込むことは可能です)。 現在、様々な地図データ可視化ライブラリをRから利用するためrMapsパッケージの開発が進められており、今後、R上で更に簡単に地図データの可視化が可能となるでしょう。

図2: morris.js, NVD3, leafletのプロット例

DataTables

DataTablesライブラリ( http://datatables.net/ )では表を作成することができます。 ウェブ上で表を表示するメリットとして、動的なフィルタ、ソート、検索などが可能な点が挙げられます。 表では可視化とは異なり具体的な数値を表示することができるので、可視化でデータの概要を把握し、表によりデータの詳細情報を得る、といったことが可能になります。

DataTablesのオブジェクトはdTable()により作成します。dTableに引数にはDataTablesライブラリの豊富なfeaturesオプション( http://legacy.datatables.net/usage/features )を渡すことが出来ます(rChartsに添付されているDataTablesのバージョンは1.9なので注意して下さい)。 たとえばbPaginate = FALSEとすると表全体を一覧できます。さらにsScrollY = "200px"とすることで、この大きさの領域でスクロール表示されます。

次の例ではirisデータを表示しています。ブラウザ上で検索ボックスからフィルタ操作を行っています(図3)。 また、列ヘッダをクリックすると、その列で並べ替えが出来ます。

> dTable(iris, bPaginate = F, sScrollY = "200px")

図3: NVD3、DataTablesの例

さいごに

これまで約2回半にわたって、R上でJavascript可視化ライブラリを利用する方法を解説してきました。 R上での可視化が基本的に静的(画像などに出力する)なのに対して、 javascriptライブラリを利用したウェブ上での可視化では、マウス操作による変数選択や範囲選択、値のポップアップ表示など、 複雑なデータをより効率的に探索するための動的な可視化が利用できます。 rCharts以外にもgoogleVisパッケージ(2013年11月号)なども使うことができます。 これらのツールを活かして、「一味違う」可視化のメリットを大いに享受して見てください。一度使い始めたら手放せなくなること間違いありません。

なおrChartsやjavascriptライブラリは現在でも活発に開発が続けられています。 最新の情報は拙著『シリーズUseful R ドキュメント・プレゼンテーション生成』(共立出版)のサポートサイト( http://kohske.github.io/R/useful_r_09/ )でフォローして下さい。 サポートサイトからは本誌では紙面の都合であまり掲載できなかったグラフ描画例を閲覧することもできます。

次回は「Rとウェブの融合」は一回お休みして、大規模データの高速な集計を可能とするdata.tableパッケージとdplyrパッケージについて紹介します。