シリーズ Useful R 9巻「ドキュメント・プレゼンテーション生成」のサプリメントです。 rChartsパッケージでhighchartsライブラリを使う方法についての補足です。

シリーズ Useful R / ドキュメント・プレゼンテーション生成 / Amazon

サポートサイト


概要

Highchartsはヒジョ〜〜に多機能なグラフ描画ライブラリです。

rChartsでHighchartsを利用するには、hPlot関数を呼び出してプロットオブジェクトを作成します。 プロットオブジェクトはHighchartsライブラリのAPIに対応したメソッドを持っているので、 このメソッドを通してチャートのカスタマイズを行うことができます。

メソッドには名前付きリストでオプションを渡します。これはJavascriptの中ではJSON形式に変換されます。

例えば、X軸のカスタマイズを行うには以下のようにします。 オプション指定はややこしいのですが、慣れてくるとなんとなくで使えるようになります。 慣れるまでは色々と試してみてください。

p <- hPlot(y ~ x, data = data.frame(x = letters[1:4], y = runif(1:4)), type = "column")
p$xAxis(title = list(text = "X軸タイトル"), categories = list("あ", "い", "う", "え"))
p$show("inline", include_assets = FALSE)

rChartsではHighchartsライブラリのAPIの大部分をサポートしています。

オプションの詳細はHighchartsライブラリのAPIHighchartsのデモを見て下さい。


ラインチャート

デフォルトはラインチャートになります。 ここではlegendで凡例の縦ならべで右表示に変更しています。 またデータラベルを有効にしています。見づらいっ!!

d <- expand.grid(g = letters[1:4], x = 1:12)
d$y <- rpois(nrow(d), 100)
p <- hPlot(y ~ x, group = "g", data = d)
# 凡例の変更
p$legend(layout = "vertical", align = "right", verticalAlign = 'middle')
# データラベルを有効に
p$plotOptions(line = list(dataLabels = list(enabled = TRUE)))
p$show("inline", include_assets = FALSE)

スプライン補間

type="spline"とするとスプライン補間されます。 ここではx軸方向のズームを有効にしています。マウスでグリっと横方向にドラッグしてみてください。

d <- expand.grid(g = letters[1:4], x = 1:12)
d$y <- rpois(nrow(d), 100)
p <- hPlot(y ~ x, group = "g", data = d, type = "spline")
# ズームの指定
p$chart(zoomType = "x")
p$show("inline", include_assets = FALSE)

エリアチャート

type="area"でエリアチャートです。ここでは見やすいようにyAxisでY軸の下限を変更しています(ホントはよくない><)。

d <- expand.grid(g = letters[1:4], x = 1:12)
d$y <- rpois(nrow(d), 100)
p <- hPlot(y ~ x, group = "g", data = d, type = "area")
# y軸範囲の変更
p$yAxis(min = min(d$y)-1)
p$show("inline", include_assets = FALSE)

割合表示のエリアチャート

plotOptionsで割合表示の積み上げにしています。 stacking = "normal"とすると通常の積み上げエリアチャートになります。

d <- expand.grid(g = letters[1:4], x = 1:12)
d$y <- rpois(nrow(d), 100)
p <- hPlot(y ~ x, group = "g", data = d, type = "area")
# スタック形式の設定
p$plotOptions(area = list(stacking = "percent"))
p$show("inline", include_assets = FALSE)

区間表示

type = "arearange"とすると区間表示できます。信頼区間の表示にいいですね。 ここではまずラインチャートを作成して、そこにseriesで新たにデータと描画形式を追加しています。 このように、seriesによって違うタイプのチャートを組み合わせることができます。

d <- data.frame(x = 1:12, y = rnorm(12))
d2 <- data.frame(x = 1:12, y0 = d$y-1, y1 = d$y+1)
p <- hPlot(y ~ x, data = d, type = "line")
# 区間表示の追加
p$series(data = toJSONArray2(d2, json = F, names = F), type = "arearange", fillOpacity = 0.3, zIndex = 0, lineWidth = 0)
p$show("inline", include_assets = FALSE)

コラムチャート・バーチャート

縦向きの棒はコラムチャート、横向きの棒はバーチャートです。

積み上げバーチャート

type = "bar"でバーチャートです。plotOptionsでスタックの形式を指定できます。

hair_eye <- as.data.frame(HairEyeColor)
p <- hPlot(Freq ~ Hair, group = 'Eye', data = subset(hair_eye, Sex == "Female"), type = 'bar')
# 積み上げに
p$plotOptions(series = list(stacking = "normal"))
# 凡例のタイトルを追加
p$legend(title = list(text = "Eye"))
p$show("inline", include_assets = FALSE)

ネガティブありのバーチャート

年代別人口とかでよく見るやつですね。

ここではhPlotではなくHighcharts$new()で空のプロットオブジェクトを作成して、データや軸を追加していっています。 なお、カテゴリカルな変数は文字列だと辞書順に並べ替えられてしまうので、factor型にしてレベルを明示しましょう(ggplot2と同じです)。

ages <- factor(1:10, labels = paste0("〜", 1:10*10))
d <- data.frame(age = ages, M = 1:10+runif(10), F = 1:10+runif(10))
# まず空のプロットオブジェクト
p <- Highcharts$new()
# バーチャートに設定
p$chart(type = "bar")
# 男性のデータ追加
p$series(name = "男性", data = -d$M)
# 女性のデータ追加
p$series(name = "女性", data = d$F)
# 左側の軸
p$xAxis(reversed = FALSE, categories = ages)
# 右側の軸。replace =  FALSEを忘れずに。
p$xAxis(opposite = TRUE, linkedTo = 0, reversed = FALSE, categories = ages, replace = FALSE)
# 積み上げに
p$plotOptions(series = list(stacking = "normal"))
# タイトルなど
p$title(text = "2100年の年代別人口")
p$subtitle(text = "データは適当")
p$show("inline", include_assets = FALSE)

コラムチャート

type = "column"でコラムチャート(横向きの棒グラフ)です。 ここではラベルをカスタマイズしています。

hair_eye <- as.data.frame(HairEyeColor)
p <- hPlot(Freq ~ Hair, group = 'Eye', data = subset(hair_eye, Sex == "Female"), type = 'column')
# データラベルの追加
p$plotOptions(column = list(dataLabels = list(enabled = T, rotation = -90, align = 'right', color = '#FFFFFF', x = 4, y = 10)))
# X軸のテキストをカスタマイズ
p$xAxis(type = "category", labels = list(rotation = 90, align = "left"))
# 凡例にかぶるのでマージンを変更
p$legend(margin = 30)
p$show("inline", include_assets = FALSE)

パイチャート

type = "pie"でパイチャート。

d <- data.frame(label = letters[1:4], value = runif(4))
p <- hPlot(value ~ label, data = d, type = 'pie')
p$show("inline", include_assets = FALSE)

ドーナツチャート

普通のドーナツチャートです。

d <- data.frame(label = letters[1:4], value = runif(4))
p <- hPlot(value ~ label, data = d, type = 'pie')
p$plotOptions(pie = list(innerSize = "60%"))
p$show("inline", include_assets = FALSE)

半円ドーナツチャート

視聴率に円グラフは、ダメですよ。 これはあくまでサンプルです。 なお、endAngleはrCharts付属のHighchartsライブラリのバージョンでは使えないようです。

d <- data.frame(label = c("'92 巣立ち", "'95 秘密", "'98 時代", "'02 遺言"), value = c(32, 30, 25, 38))
p <- hPlot(value ~ label, data = d, type = 'pie')
p$plotOptions(pie = list(innerSize = "80%", startAngle = -90, endAngle = 90, center = list("50%", "75%")))
p$title(text = "北の国から<br/>視聴率", align = "center", verticalAlign = "middle", y = 50)
p$show("inline", include_assets = FALSE)

階層型のドーナツチャート

例えば階層的なカテゴリの割合を表現するにはいいかもしれません。

library(plyr)
# 例えばこういうデータ
d <- data.frame(m = sample(LETTERS[1:2], 1000, TRUE, c(0.2, 0.8)), n = sample(letters[1:5], 1000, TRUE, 1:5/10))
# 1層目用データ
d1 <- toJSONArray2(count(d, .(m)), json = F, name = F)
# 2層目用データ
d2 <- toJSONArray2(count(d, .(m, n))[-1], json = F, name = F)

# 空のプロットオブジェクト
p <- Highcharts$new()
p$chart(type = "pie")
# 1層目の作成
p$series(data = d1, size = "50%", dataLabels = list(enabled = FALSE), colors = hsv(c(0, 0.5), 0.8, 0.8))
# 2層目の作成
p$series(data = d2, size = "80%", innerSize = "60%", 
         colors = hsv(rep(c(0, 0.5), each = 5), seq(0.2, 0.8, len = 5), seq(0.5, 0.8, len = 5)),
         replace = FALSE)
p$show("inline", include_assets = FALSE)

散布図

type = "scatter"で散布図です。

p <- hPlot(Sepal.Length ~ Sepal.Width, group = "Species", data = iris, type = "scatter")
p$show("inline", include_assets = FALSE)

ズーム付き散布図

プロット上でマウスをドラッグするとその領域にズームします。

p <- hPlot(Sepal.Length ~ Sepal.Width, group = "Species", data = iris, type = "scatter")
p$chart(zoomType = "xy")
p$show("inline", include_assets = FALSE)

その他

ゲージチャート

オプション指定すればHighchartsのデモ にあるようにいろいろデコれます。

d <- data.frame(value = c(42))
p <- hPlot(x = "value", y = NULL, data = d, type = 'gauge')
p$show("inline", include_assets = FALSE)

3D棒グラフ

3DグラフはrCharts付属のHighchartsのバージョンでは使えないようです。 使わなくていいと思います。

d <- data.frame(x = 1:10, y = runif(10))
p <- hPlot(y ~ x, data = d)
p$chart(type = "column", 
        margin = 75, 
        options3d = list(enabled = TRUE, alpha = 15, beta = 15, depth = 50, viewDistance = 25))
p$show("inline", include_assets = FALSE)

3D円グラフ(使うな危険!)

d <- data.frame(x = LETTERS[1:5], y = runif(5))
p <- hPlot(y ~ x, data = d)
p$chart(type = "pie", 
        options3d = list(enabled = TRUE, alpha = 45, beta = 0))
p$plotOptions(pie = list(depth = 35))
p$show("inline", include_assets = FALSE)

ツールチップ

tooltipメソッドでマウスオーバーでポップアップするツールチップをカスタマイズできます。 オプションの詳細はHighchartsのAPI を参考にして下さい。

p <- hPlot(Sepal.Length ~ Sepal.Width, group = "Species", data = iris, type = "scatter")
p$tooltip(formatter = "#! function() {return 'xは' + this.x + 'で、yは' + this.y;} !#")
p$show("inline", include_assets = FALSE)

Enjoy!!