In their words:

Bokeh is a visualization library that provides a flexible and powerful declarative framework for creating web-based plots. Bokeh renders plots using HTML canvas and provides many mechanisms for interactivity. Bokeh has interfaces in Python, Scala, Julia, and now R.

rbokeh is one of my new favourite R things.

I never used bokeh before, but I am a big fan of the R version. rbokeh is now my favourite way of quickly visualizing data while doing first pass or exploratory analyses. When I think “I wonder what this data looks like?”, I jump to rbokeh first.

The syntax is efficient and intuitive (maybe because I am already familiar with ggplot) and I feel I get a lot of great stuff for little effort.

Want the ability to see values when you hover over points? Just add hover = list(var1, var2). Want to be able to lasso a group of points on a plot and focus on those? Just add %>% tool_lasso_select().

Since rbokeh creates plots using HTML canvas, it’s well-suited to plotting in R Markdown documents and embedding plots in web pages like this one.

How?

The following is a summary or repetition of what I learned from the rbokeh documentation and this post by Bob Rudis. Why the repetition? In the spirit of “two is one and one is none”, and because it never hurts to have redundancy for knowledge on the internet.

To plot in R / RStudio

You need to install and load the rbokeh library.

install.packages("rbokeh")
library(rbokeh)

The documentation is a good introduction to the basic plots you can create. Here is a starter example:

data(iris)

figure() %>% 
  ly_points(x = Sepal.Length, y = Petal.Length, data = iris)

The amount of plot and functionality I get per keystroke still gives me a rush.

That was a basic plot. Let’s do some customization.

data(iris)

figure(legend_location = "top_left", outline_line_alpha = 0) %>% 
  ly_points(x = Sepal.Length, y = Petal.Length, data = iris,
           glyph = Species,
           hover = list(Sepal.Length, Petal.Length)) %>% 
  ly_lines(lowess(iris$Sepal.Length, iris$Petal.Length), color = "red", legend = "Lowess line") %>% 
  x_axis(label = "Sepal length", grid = FALSE) %>% 
  y_axis(label = "Petal length", grid = FALSE) %>% 
  tool_lasso_select()

To save the plot to an html file

You will need the htmlwidgets library. From that, you can use the saveWidget() function.

install.packages("htmlwidgets")
library(htmlwidgets)

myplot <- figure() %>% 
              ly_points(x = Sepal.Length, y = Petal.Length, data = iris)


saveWidget(myplot, file = "iris_plot.html")

To embed plot in Jekyll or other web pages

The best way I’ve found is to use an iframe.

<iframe src="/assets/plots/iris_plot.html"
    style="max-width = 100%"
    sandbox="allow-same-origin allow-scripts"
    width="100%"
    height="600"
    scrolling="no"
    seamless="seamless"
    frameborder="0">
</iframe>

You can control the plot dimensions from the robokeh end if you need to:

figure(width = 500, height = 600) %>% 
  ly_points(x = Sepal.Length, y = Petal.Length, data = iris)

There is one downside to embedding rbokeh plots in web pages: they are expensive when it comes to bandwidth.

The two plots on this page are 1.3 MB each. That’s a lot. This page is 2.62 MB in total. The rbokeh plots make up 99% of that. So you can’t throw these plots around willy-nilly. Use few and make them count.

Actually, let me be that guy for a second: “use few and make them count” is good advice for plots of any kind.