インタラクティブな可視化のためのbillboarderの紹介

## billboarderとは？

Rでインタラクティブなプロットを書きたいときに、最近自分は`billboarder`を好んで使用しています。おそらく日本でこれを使っている人をあまり見たことがないので、いくつかサンプルコードを紹介します

`billboarder`の`billboard.js`のRラッパー。`billboard.js`はNAVERが開発しているようで、安心のMITライセンスです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69266/0471090b-efaa-ac29-533a-32c19abfae37.png)

`billboarder`はShiny系のRパッケージの開発で有名なdreamRsの開発している。彼らが紹介しているShinyAppでもbillboarderがよく使用されています

#### 参考
* [dreamRs/billboarder: R Htmlwidget for billboard.js](https://github.com/dreamRs/billboarder)
* [dreamRs shiny gallery](http://shinyapps.dreamrs.fr/)

## 使い方

以下のサイトを見てくれればどんなプロットができるかがわかると思います
[Create Interactive Chart with the JavaScript Billboard Library • billboarder](https://dreamrs.github.io/billboarder/index.html)

ひとまずライブラリをロード

```r
> library(billboarder)
> print(packageVersion("billboarder"))
[1] ‘0.2.7’
```

ここでは、自分が最近よく使ってる**線プロット**と**棒グラフ**と**Shiny**の例の3つの事例を紹介します

## サンプルデータ1

適当なSubjectごとの時系列データとして`Indometh`を利用します

```r
> data(Indometh)
> head(Indometh, 10)
   Subject time conc
1        1 0.25 1.50
2        1 0.50 0.94
3        1 0.75 0.78
4        1 1.00 0.48
5        1 1.25 0.37
6        1 2.00 0.19
7        1 3.00 0.12
8        1 4.00 0.11
9        1 5.00 0.08
10       1 6.00 0.07
```

Subjectをわかりやすくするため加工します

```r
Indometh$Subject <- paste0("s",as.character(Indometh$Subject))
```

## 事例1: 線プロット

最小実行コードとして以下でOK。縦持ちデータをそのまま扱えるので、ggplotに慣れた我々にとっては馴染みのある感じで入力できます。非常にシンプルなコードでインタラクティブな線プロットができます

```r
billboarder(data = Indometh) %>%
  bb_linechart(
    mapping = bbaes(x = time, y = conc, group = Subject)
  )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69266/14ae8fd1-d7fd-1d74-30b7-2f48eaa32fd9.png)

凡例の上にカーソルを持っていけばそれだけがハイライトされます（下の図はs4の上にマウスカーソルがある）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69266/c4d882a0-0045-9907-8e6c-f44f4d69d57c.png)


さらに、billboarder横持ちデータを入力として使えます。コードはよりシンプルに。一旦横持ちデータを準備します

```r
> Indometh_wide <- Indometh %>% tidyr::spread(Subject, conc)
> head(Indometh_wide, 10)
   time   s1   s2   s3   s4   s5   s6
1  0.25 1.50 2.03 2.72 1.85 2.05 2.31
2  0.50 0.94 1.63 1.49 1.39 1.04 1.44
3  0.75 0.78 0.71 1.16 1.02 0.81 1.03
4  1.00 0.48 0.70 0.80 0.89 0.39 0.84
5  1.25 0.37 0.64 0.80 0.59 0.30 0.64
6  2.00 0.19 0.36 0.39 0.40 0.23 0.42
7  3.00 0.12 0.32 0.22 0.16 0.13 0.24
8  4.00 0.11 0.20 0.12 0.11 0.11 0.17
9  5.00 0.08 0.25 0.11 0.10 0.08 0.13
10 6.00 0.07 0.12 0.08 0.07 0.10 0.10   
```

横持ちならデータを入力するだけ。簡単！

```r
billboarder(data = Indometh_wide) %>% 
  bb_linechart() 
```

いろいろとメイクアップしてみます。だいたいこれできれいな感じになります（適当）

```r
billboarder(data = Indometh_wide) %>%
  bb_linechart() %>%
  bb_y_grid(show = T) %>%
  bb_legend(position = "inset") %>%
  bb_zoom(
    enabled = list(type = "drag"),
    resetButton = list(text = "Unzoom")
  ) %>%
  bb_title(text = "Indometh", position = "center") %>%
  bb_y_axis(
    tick = list(format = htmlwidgets::JS("d3.format(',')"))
  )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69266/2a27aa1b-9a83-17ed-7bd1-63b1a2ec7150.png)


## サンプルデータ2

棒グラフを描く前に別のサンプルデータを用意します。ここでは`CO2`データを準備

```r
> data(CO2)
> 
> CO2_mean <- CO2 %>% 
  group_by(Type, Treatment) %>% 
  dplyr::summarise(mean_conc = mean(conc)) %>%
  tidyr::spread(Treatment, mean_conc)
> CO2_mean
# A tibble: 2 x 3
# Groups:   Type [2]
  Type        nonchilled chilled
  <fct>            <dbl>   <dbl>
1 Quebec             435     435
2 Mississippi        435     435
```

## 事例2: 棒グラフ

最小実行コードは以下のような感じ

```r
billboarder(data = CO2_mean) %>%
  bb_barchart(stacked = F) 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69266/5ee15a71-f162-4dd1-276f-42c418d0374f.png)

いろいろとメイクアップしてみます。だいたいこれできれいな感じになります（適当）

```r
billboarder(data = CO2_mean) %>%
  bb_barchart(stacked = F) %>%
  bb_x_grid(show = T) %>%
  bb_y_grid(show = T) %>%
  bb_legend(position = "inset") %>%
  bb_zoom(
    enabled = list(type = "drag"),
    resetButton = list(text = "Unzoom")
  ) %>%
  bb_title(text = title, position = "center") %>%
  bb_y_axis(
    tick = list(format = htmlwidgets::JS("d3.format(',')"))
  )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69266/fc6377d0-457e-8da2-ac3c-f0bdd502157b.png)

## 事例3: Shiny

billboarderのtooltipを使えば、便利なインタラクティブ機能が簡単に作れるみたいです

ここでは、マウスカーソルのx軸の値に該当する箇所に複数のグラフを跨いで縦線を描いてくれる機能を紹介します

複数の時系列グラフを同時に確認するケースでとても有効ですね

デモ : https://okiyuki.shinyapps.io/ex_billboarder/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69266/b6b87dca-5ea1-ba0f-4270-aaa6faba6c33.png)

コードはこんな感じ。`bb_tooltip(linked = list(name = "tooltip-test"))` だけでOK

```r
library(shiny)
library(billboarder)

ui <- fluidPage(
  billboarderOutput(outputId = "Indo1"),
  billboarderOutput(outputId = "Indo2")
)

server <- function(input, output, session) {
  
  data(Indometh)
  Indometh_wide <- Indometh %>% tidyr::spread(Subject, conc)
  
  output$Indo1 <- renderBillboarder({
    billboarder(data = Indometh_wide) %>%
      bb_linechart() %>%
      bb_y_grid(show = T) %>%
      bb_legend(position = "inset") %>%
      bb_zoom(
        enabled = list(type = "drag"),
        resetButton = list(text = "Unzoom")
      ) %>%
      bb_title(text = "Indometh1", position = "center") %>%
      bb_y_axis(
        tick = list(format = htmlwidgets::JS("d3.format(',')"))
      ) %>% 
      bb_tooltip(
        linked = list(name = "tooltip-test"),
        format = list(value = htmlwidgets::JS("d3.format(',')"))
      )
  })
  
  output$Indo2 <- renderBillboarder({
    billboarder(data = Indometh_wide) %>%
      bb_linechart() %>%
      bb_y_grid(show = T) %>%
      bb_legend(position = "inset") %>%
      bb_zoom(
        enabled = list(type = "drag"),
        resetButton = list(text = "Unzoom")
      ) %>%
      bb_title(text = "Indometh2", position = "center") %>%
      bb_y_axis(
        tick = list(format = htmlwidgets::JS("d3.format(',')"))
      ) %>% 
      bb_tooltip(
        linked = list(name = "tooltip-test"),
        format = list(value = htmlwidgets::JS("d3.format(',')"))
      )
  })
}

shinyApp(ui = ui, server = server)
```

## まとめ

* インタラクティブな可視化にbillboarderというのがあるというご紹介
* お手軽に使えるのでおすすめ