The R Script associated with this page is available here. Download this file and open it (or copy-paste into a new script) with RStudio so you can follow along.

Introduction

In this module we will explore several ways to generate dynamic and interactive data displays. These include making maps and graphs that you can pan/zoom, select features for more information, and interact with in other ways. The most common output format is HTML, which can easily be embedded in a website (such as your final project!).

library(dplyr)
library(ggplot2)
library(ggmap)
library(htmlwidgets)
library(widgetframe)

If you don’t have the packages above, install them in the package manager or by running install.packages("doParallel").

DataTables

DataTables display R data frames as interactive HTML tables (with filtering, pagination, sorting, and search). This is a great way to make your raw data browsable without using too much space.

library(DT)
datatable(iris, options = list(pageLength = 5))

rbokeh

Interface to the Bokeh library for making interactive graphics.

library(rbokeh)
figure(width = 400, height=400) %>%
  ly_points(Sepal.Length, Sepal.Width, data = iris,
    color = Species, glyph = Species,
    hover = list(Sepal.Length, Sepal.Width))

Leaflet

Leaflet is a really powerful JavaScript library for creating dynamic maps that support panning and zooming along with various annotations like markers, polygons, and popups. The example below were adapted from the leaflet vignettes.

library(leaflet)
geocode("Buffalo, NY")
##         lon      lat
## 1 -78.87837 42.88645
m <- leaflet() %>% setView(lng = -78.87837, lat = 42.88645, zoom = 12) %>% 
  addTiles()
frameWidget(m,height =500)

Your turn

This example only scratches the surface of what is possible with leaflet. Consider whether you can use an leaflet maps in your project.

  • Browse the Leaflet website
  • What data could you use?
  • How would you display it?

dygraphs

An R interface to the ‘dygraphs’ JavaScript charting library. Provides rich facilities for charting time-series data in R, including highly configurable series- and axis-display and interactive features like zoom/pan and series/point highlighting.

library(dygraphs)
dygraph(nhtemp, main = "New Haven Temperatures",height = 100) %>% 
  dyRangeSelector(dateWindow = c("1920-01-01", "1960-01-01"))%>%
  frameWidget(height =500)

Your turn

Make a dygraph of recent daily maximum temperature data from Buffalo, NY.

Hints:

  • Use the following code to download the daily weather data (if this is taking too long, you can use the nhtemps object loaded above)
library(rnoaa)
library(xts)

d=meteo_tidy_ghcnd("USW00014733",
                   date_min = "2016-01-01", 
                   var = c("TMAX"),
                   keep_flags=T)
d$date=as.Date(d$date)
  • create a xts time series object as required by dygraph() using xts() and specify the vector of data and the date column (see ?xts for help).
  • use dygraph() to draw the plot
  • add a dyRangeSelector() with a dateWindow of c("2017-01-01", "2017-12-31")
# Convert to a xts time series object as required by dygraph
dt=xts(d$tmax,order.by=d$date)

dygraph(dt, main = "Daily Maximum Temperature in Buffalo, NY") %>% 
  dyRangeSelector(dateWindow = c("2017-01-01", "2017-12-31"))%>%
  frameWidget(height =500)

rthreejs

Create interactive 3D scatter plots, network plots, and globes using the ‘three.js’ visualization library.

#devtools::install_github("bwlewis/rthreejs")
library(threejs)
z <- seq(-10, 10, 0.1)
x <- cos(z)
y <- sin(z)
scatterplot3js(x, y, z, color=rainbow(length(z)))

networkD3

Creates ‘D3’ ‘JavaScript’ network, tree, dendrogram, and Sankey graphs from ‘R’.

library(igraph)
library(networkD3)

Load example network

This loads an example social network of friendships between 34 members of a karate club at a US university in the 1970s. See W. W. Zachary, An information flow model for conflict and fission in small groups, Journal of Anthropological Research 33, 452-473 (1977).

karate <- make_graph("Zachary")
wc <- cluster_walktrap(karate)
members <- membership(wc)

# Convert to object suitable for networkD3
karate_d3 <- igraph_to_networkD3(karate, group = members)

Force directed network plot

forceNetwork(Links = karate_d3$links, Nodes = karate_d3$nodes,
             Source = 'source', Target = 'target', NodeID = 'name',
             Group = 'group')%>%
  frameWidget(height =500)

Sankey Network graph

Sankey diagrams are flow diagrams in which the width of the arrows is shown proportionally to the flow quantity.

# Load energy projection data
library(jsonlite)
URL <- paste0(
        "https://cdn.rawgit.com/christophergandrud/networkD3/",
        "master/JSONdata/energy.json")
Energy <- fromJSON(URL)
sankeyNetwork(Links = Energy$links, Nodes = Energy$nodes, Source = "source",
             Target = "target", Value = "value", NodeID = "name",
             units = "TWh", fontSize = 12, nodeWidth = 30)%>%
  frameWidget(height =500)

Radial Network

URL <- paste0(
        "https://cdn.rawgit.com/christophergandrud/networkD3/",
        "master/JSONdata//flare.json")

## Convert to list format
Flare <- jsonlite::fromJSON(URL, simplifyDataFrame = FALSE)
# Use subset of data for more readable diagram
Flare$children = Flare$children[1:3]

radialNetwork(List = Flare, fontSize = 10, opacity = 0.9, height = 400, width=400)

Diagonal Network

diagonalNetwork(List = Flare, fontSize = 10, opacity = 0.9, height = 400, width=400)

rglwidget

RGL provides 3D interactive graphics, including functions modelled on base graphics (plot3d(), etc.) as well as functions for constructing representations of geometric objects (cube3d(), etc.). You may need to install XQuartz.

library(rgl)
library(rglwidget)
library(htmltools)

# Load a low-resolution elevation dataset of a volcano
data(volcano)

Plot an interactive 3D surface

persp3d(volcano, type="s",col="green3")
rglwidget(elementId = "example", width = 500, height = 400)%>%
  frameWidget()

Your turn

Check out the HTML Widgets page for many more examples.

Which can you use in your project?