Create Interactive Data Visualization with Plotly in R

Author

David M. Miller, Sophia Z. Shalhout

Published

February 5, 2020

Abstract
This working document is a user guide on how to create interactive graphs with R via a package called plotly

Overview

  • This is an RMarkdown explaining how we use the Plotly package to more effectivley communicate clinical and translational research via interactive graphs
  • Plotly is a computing company that develops online data analytics and visualization tools
  • It has open sourced many useful interactive visualization products.
  • Plotly can be used in several programming languages (e.g. Python, R and JavaScript)
    • This tutorial will be written with instruction for R users
    • Although https://plot.ly/ is fabulous resource, we found that there were elements from those tutorials that were missing and we hope that this post will provide a useful resource to get started in Plotly in R
  • Why use Plotly?
    • Plotly allows us to create visually appealing interactive plots.
    • The ability to export to html and retain all interactive functionality is easily accomplished with Plotly.
    • It is focused around the ability to generate interactive plots with a few lines of code.
    • Finally, all interactive features are compatible with modern web browsers.

Step 1, Download Plotly from CRAN

  • Use the install.package() function to install the plotly R package from CRAN install.packages("plotly")

Load Relevant Packages

library(tidyverse)
library(knitr)
library(plotly)
library(readxl)
library(scales)
library(kableExtra)

Load dataset

  • For the first example we will use mtcars (Motor Trend Car Road Tests), which is built into base R
mtcars <- mtcars

View the mtcars Data Frame

mtcars  %>% 
  kbl(align = "c") %>% 
  kable_styling(
    bootstrap_options = c("striped","hover","condensed"),
    full_width = F,
    font_size = 16,
    fixed_thead = T
  ) %>% 
  scroll_box(
    height = "500px"
  )
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2

Make an Interactive Bar Chart in Plotly

  • For this first example, we will make a bar chart of the number of vehicles with “4”, “6” and “8” cylinders
  • One approach is to create a new data frame with two vectors (columns)
    • one that we create with the String “Four Cylinders”, “Six Cylinders”, and “Eight Cylinders” and
    • another Vector that is the sum of all of the rows in mtcars that have a “4”, “6” or “8” in them.
    • We’ll call the first vector “vehicles” and the second “cylinders”
  • This allows us to make a table that has a very defined x-axis and y-axis to make construtcting a bar graph very straight forward
vehicles <- c("Four Cylinders","Six Cylinders","Eight Cylinders")
cylinders <- c(sum(mtcars$cyl==4), sum(mtcars$cyl==6), sum(mtcars$cyl==8)) # of note, the sum() function will allow us to add up all the observations with either a "4" or a "6" or a "8" 

View these two vectors

vehicles  %>% 
  kbl(align = "c") %>% 
  kable_styling(
    bootstrap_options = c("striped","hover","condensed"),
    full_width = F,
    font_size = 16,
    fixed_thead = T
  ) 
x
Four Cylinders
Six Cylinders
Eight Cylinders
cylinders  %>% 
  kbl(align = "c") %>% 
  kable_styling(
    bootstrap_options = c("striped","hover","condensed"),
    full_width = F,
    font_size = 16,
    fixed_thead = T
  ) 
x
11
7
14
  • As you can see, there are 11 vehicles with “4” contained in the columns’ cells, 7 with “6” and 14 with “8”
  • Now combine these two vectors into a tibble, we’ll call it “veh_cyl”
    • Of note, a tibble is a modern rework of the standard data.frame, with some internal improvements to make code more reliable.
      • They are data frames, but do not follow all of the same rules
        • For example, tibbles can have column names that are not normally allowed, such as numbers/symbols.
veh_cyl <- tibble(vehicles, cylinders)

View new Tibble

veh_cyl  %>% 
  kbl(align = "c") %>% 
  kable_styling(
    bootstrap_options = c("striped","hover","condensed"),
    full_width = F,
    font_size = 16,
    fixed_thead = T
  )
vehicles cylinders
Four Cylinders 11
Six Cylinders 7
Eight Cylinders 14
Now that we have a tibble that can be easily turned into a bar graph, let’s use Plotly to make an interactive graph
plot_ly(data = veh_cyl, x = vehicles, y = cylinders, type = "bar", text = cylinders, textposition = "auto") %>% 
  layout(title = "Number of Vehicles in mtcars with 4, 6, and 8 Cylinders",
         titlefont = list(size = 28, color = "orange", family = "Calibri"),
    yaxis = list(title = "Number of Vehicles",
                 titlefont = list(color = "black", family = "Arial", size = 26),
                 tickfont = list(color = "black", family = "Arial", size = 20)),
    xaxis = list(title = "Number of Cylinders",
                 titlefont = list(color = "red", family = "Times New Roman", size = 22),
                 tickfont = list(color = "green", family = "Cambria", size = 18)))%>% 
  layout(margin = list( 
                l = 10,
              r = 10,
              b = 0,
              t = 40)) # Use the layout(margin) function to adjust the margins of the graph
num_vehicles.knit