The ggiraph package let R users to make ggplot interactive. The package is an htmlwidget.

It extends ggplot2 with new geom functions:

Three arguments let you add interactivity:

library(ggiraph)
mytheme_main <- theme( panel.background = element_blank(), 
  panel.grid.major = element_line(colour = "#dddddd"), 
  axis.ticks = element_line(colour = "#dddddd") )

mytheme_map <- theme(
  panel.background = element_blank(), axis.title.x = element_blank(),
  axis.text = element_blank(), axis.line.x = element_blank(),
  axis.line.y = element_blank(), axis.title.y = element_blank(),
  axis.ticks.x = element_blank(), axis.ticks.y = element_blank() )

Simple example

dataset <- mtcars
head(dataset)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
dataset$tooltip <- row.names(dataset)

# geom_point_interactive example
gg_point_1 <- ggplot(dataset, aes(x = disp, y = qsec, 
        color = wt, tooltip = tooltip ) ) + 
    geom_point_interactive(size=3)

# htmlwidget call
ggiraph(code = {print(gg_point_1 + mytheme_main)}, width = 7, height = 6)

animate elements with data-id

When graphical elements are associated with data_id attributes, a css string modifies rendering when mouse is over. Default value is hover_css = "{fill:orange;}".

dataset$data_id <- tolower(row.names(dataset))

# geom_point_interactive example
gg_point_2 <- ggplot(dataset, aes(x = disp, y = qsec, 
        color = wt, tooltip = tooltip, data_id = data_id ) ) + 
    geom_point_interactive(size=4)

# htmlwidget call
ggiraph(code = {print(gg_point_2 + mytheme_main)}, 
        width = 7, height = 6, 
        hover_css = "{fill:orange;r:6px;}")

data-id can also be reused within a shiny application.

Click actions

crimes <- data.frame(state = tolower(rownames(USArrests)), USArrests)

crimes$onclick <- sprintf(
  "function() {window.open('%s%s')}",
  "http://en.wikipedia.org/wiki/",
  as.character(crimes$state)
)

if (require("maps") ) {
  states_map <- map_data("state")
  gg_map <- ggplot(crimes, aes(map_id = state))
  gg_map <- gg_map + 
    geom_map_interactive(
      aes( fill = Murder, tooltip = state, 
           onclick = onclick, data_id = state), 
      map = states_map) + 
    expand_limits(x = states_map$long, y = states_map$lat)
}

ggiraph(code = {print(gg_map + mytheme_map)}, width = 7, height = 5)