LoginSignup
3
1

More than 3 years have passed since last update.

インタラクティブな可視化ができるrbokehを触ってみる

Posted at

先日pythonの可視化ライブラリの1つであるbokehのR版であるrbokehを触る機会があったのでまとめてみました。

触った感じはggplotのようにレイヤーを重ねていく感じで可視化をできるし、hoverで表示するデータの設定などがplotlyなどよりも簡単だと感じたので、結構良かったです。しかし、Rのインタラクティブな可視化では依然、plotlyやggplotlyが主流ですし、今後rbokehがとって変わるまでは感じませんでしたし、ググった時のヒットするページなんかもみてもあまり需要はなさそうです。
自分もこれから、たくさん使用していくかは微妙ですが、選択肢の一つとして使えることに越したことはナイト思うので、基本的ななエッセンスの部分をこの記事にまとめてまた触るたびに見返したいと思います。

準備

# install.packages("rbokeh")
library(tidyverse)
library(rbokeh)
library(gapminder)
data(gapminder)

gapminder_07 = filter(gapminder, year == max(year)) #2007年データ
gapminder_asia = filter(gapminder, continent == "Asia") #アジア諸国データ
gapminder_asia_07 = filter(gapminder_asia, year == max(year)) # 2007年に限定したアジア諸国データ

基本的な可視化

基本的な構文はggplotでの可視化にかなり近いです。

## ggplot
ggplot() +
  geom_...(aes(data, x, y))

## rbokeh
figure() %>%
  ly_...(data, x, y)

上のように、rbokehでは可視化を始める際に一番上に、figure()として始めたり、%>%で繋いでいったりと違う点も多いですが、基本的にはggplotで可視化ができる人はすぐに慣れると思います。

ly_lines(): 折れ線グラフ

figure(legend_location = NULL) %>% 
  ly_lines(data = gapminder_asia,
           x = year, y = pop, color = country)

image.png

これはアジア諸国の人口の推移をプロットしています。上でも述べていますが、基本的には同じです。plotlyなどと違って凡例の表記がプロットの中に表示されてしまうため、legend_location=NULLと明記し、凡例の表示を便宜的にオフにしました。

ly_points(): 散布図

figure(legend_location = "bottom_right") %>% 
  ly_points(x = gdpPercap, y = lifeExp, color = continent,
            data = gapminder_07,
            hover = c(country, gdpPercap, lifeExp))

Screen Recording 2019-05-10 at 03.27 PM.gif

ly_abline(): 回帰直線の描画

figure() %>% 
  ly_points(x = gdpPercap, y = lifeExp,
            data = gapminder_07) %>% 
  ly_abline(lm(data = filter(gapminder, year == 2007), lifeExp ~ gdpPercap))

bokeh_plot (3).png

散布図内に回帰直線を描画したい場合には、少し厄介ですが、ly_abline()の中でlm()で回帰式を定義することが必要です。

線グラフと散布図を重ねる

figure(legend_location = NULL) %>% 
  ly_lines(data = gapminder_asia,
           x = year, y = pop, color = country,
           hover = c(year, pop)) %>% 
  ly_points(data = gapminder_asia,
           x = year, y = pop, color = country, fill_color = "white",
           hover = c(year, pop))

Screen Recording 2019-05-10 at 03.30 PM.gif

このように、ly_lines()ly_points()レイヤーごとに重ねることによって折れ線グラフと散布図を重ねて表示させることも可能です。そしてfill_colorを指定することにより、点ごとの枠組みのみを残して、空洞にし、見え方を変更させるオプションもあります。

hoverに関して

hoverは指定の仕方が数パターンあります。使いこなすことによってグラフの説明力をあげることができるし、見栄えもよくなるのでまとめて見ました。例に用いるのは一つ上で表示した散布図グラフです。

ちなみに何も指定しない場合には、マウスホバーしてもデータは表示されません。

一番シンプルなのはベクトルで指定してあげること。
hover = c(要素1, 要素2)のような感じで指定すると以下のようにいい感じになります。

figure(legend_location = NULL) %>% 
  ly_points(x = gdpPercap, y = lifeExp, color = country,
            data = gapminder_07,
            hover = c(country, gdpPercap, lifeExp))

Screen Recording 2019-05-10 at 03.35 PM.gif

ですがこれよりもより詳細に指定することが可能です。例にあげると、現在は表示されるデータがカラム名のままgdpPercap: XXXのように表示されていますが、これをGDP Per Capita: XXXのように表示される文字などを指定したい場合にはhover = "GDP Per Capita: @gdpPercap"のように記述することで自由にできます。""ダブルクオテーションでくくり、データとして出力したい部分の前に@をおきます。

さらにhtml形式でも書くことができ、文字を太字ににしたいときは<b>文字</b>などでくくることができます。

<b>@country</b><br><b>GDP Per Capita</b>: @gdpPercap<br><b>Life Expectancy</b>: @lifeExp"

上記のように記述すると下記のように表示させることが可能です。

figure(legend_location = NULL) %>% 
  ly_points(x = gdpPercap, y = lifeExp, color = country,
            data = gapminder_07,
            hover = "<b>@country</b><br><b>GDP Per Capita</b>: @gdpPercap<br><b>Life Expectancy</b>: @lifeExp")

Screen Recording 2019-05-10 at 03.37 PM.gif

ly_bar(): 棒グラフ

gather_iris = iris %>% 
  group_by(Species) %>% 
  summarise(
    ave_Sepal.Length = mean(Sepal.Length),
    ave_Sepal.Width = mean(Sepal.Width),
    ave_Petal.Length = mean(Petal.Length),
    ave_Petal.Width = mean(Petal.Width)) %>% 
  gather(key, values, -Species)
figure(legend_location = "top_left") %>% 
  ly_bar(data = gather_iris, x = Species, y = values,
         color = key, position = "dodge")

bokeh_plot (2).png

こちらはIrisデータを用いた可視化事例です。棒グラフも、ggplotのようにpositionで思うように表示の仕方を変更することが可能みたいです。他にもfillやなども使用可能です。

figure内プロット情報の修正

figure(legend_location = NULL,
       title = "Transition of Population of Asian countries from 1950 to 2007",
       theme = bk_ggplot_theme(),
       xlab = "Year", ylab = "Population") %>% 
  ly_lines(data = gapminder_asia,
           x = year, y = pop, color = country)

bokeh_plot (4).png

最後に、プロットする際の、軸名やメインタイトルの指定方法です。基本的には、figure()内で指定します。title, x/ylab, x/ylim, legend_locationなどが指定可能です。

上のプロットではtheme = bk_ggplot_theme()を指定することでggplotっぽい見栄えにしてみました。

まとめ

書き方やレイヤーごとにプロットを重ねていくところなどはggplotに似ていますが、ほぼ必ず%>%オペレータを用いるところなどは、なかなかR始めたての人にはおすすめできなさそうです。

それと、最初にも述べていますが現在はplotlyなどがインタラクティブな可視化では主流のためそれほど、自分にとっても使用頻度は低いままだと思いますが、なんかの機会に使うことがあればまたこの記事を見返したいと思います。

参考文献

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1