library(tidyverse)
library(knitr)
library(plotly)
library(readxl)
library(scales)
library(kableExtra)
Create Interactive Data Visualization with Plotly in R
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
andJavaScript
)- 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
inR
- This tutorial will be written with instruction for
- 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
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”
- one that we create with the String “Four Cylinders”, “Six Cylinders”, and “Eight Cylinders” and
- 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
<- c("Four Cylinders","Six Cylinders","Eight Cylinders")
vehicles <- 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" cylinders
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 standarddata.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.
- They are data frames, but do not follow all of the same rules
- Of note, a
<- tibble(vehicles, cylinders) veh_cyl
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