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:
tooltip
: column of dataset that contains tooltips to be displayed when mouse is over elements.onclick
: column of dataset that contains javascript function to be executed when elements are clicked.data_id
: column of dataset that contains id to be associated with elements.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() )
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)
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.
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)