# inst/docs.R In plotly: Create Interactive Web Graphics via 'plotly.js'

# install the new/experimental plotly R package
# devtools::install_github("ropensci/plotly@carson-dsl")

################################################################################
# Basic Charts (https://plotly.com/r/#basic-charts)
################################################################################

# ----------------------------------------------------------------------
# https://plotly.com/r/3d-line-plots/
# ----------------------------------------------------------------------

# initiate a 100 x 3 matrix filled with zeros
m <- matrix(numeric(300), ncol = 3)
# simulate a 3D random-walk
for (i in 2:100) m[i, ] <- m[i-1, ] + rnorm(3)
# collect everything in a data-frame
df <- setNames(
data.frame(m, seq(1, 100)),
c("x", "y", "z", "time")
)

# create the plotly
library(plotly)
plot_ly(df, x = x, y = y, z = z, color = time, type = "scatter3d")

# ----------------------------------------------------------------------
# https://plotly.com/r/3d-scatter-plots/
# ----------------------------------------------------------------------

# variance-covariance matrix for a multivariate normal distribution
s <- matrix(c(1, .5, .5,
.5, 1, .5,
.5, .5, 1), ncol = 3)
# use the mvtnorm package to sample 200 observations
obs <- mvtnorm::rmvnorm(200, sigma = s)
# collect everything in a data-frame
df <- setNames(data.frame(obs), c("x", "y", "z"))

library(plotly)
plot_ly(df, x = x, y = y, z = z, type = "scatter3d", mode = "markers")

# ----------------------------------------------------------------------
# https://plotly.com/r/3d-surface-plots/
# ----------------------------------------------------------------------

library(plotly)
# volcano is a numeric matrix that ships with R
plot_ly(z = volcano, type = "surface")

# 2D kernel density estimation
kd <- with(MASS::geyser, MASS::kde2d(duration, waiting, n = 50))
with(kd, plot_ly(x = x, y = y, z = z, type = "surface"))

# ----------------------------------------------------------------------
# https://plotly.com/r/filled-area-plots/
# ----------------------------------------------------------------------

library(plotly)
p <- plot_ly(x = c(1, 2, 3, 4), y = c(0, 2, 3, 5), fill = "tozeroy")
add_trace(p, x = c(1, 2, 3, 4), y = c(3, 5, 1, 7), fill = "tonexty")

# ----------------------------------------------------------------------
# https://plotly.com/r/bar-charts/
# ----------------------------------------------------------------------

library(plotly)
p <- plot_ly(
x = c("giraffes", "orangutans", "monkeys"),
y = c(20, 14, 23),
name = "SF Zoo",
type = "bar"
)
p

p,
x = c("giraffes", "orangutans", "monkeys"),
y = c(12, 18, 29),
name = "LA Zoo"
)
p2

layout(p2, barmode = "stack")

## customizing colors

library(dplyr)
ggplot2::diamonds %>% count(cut) %>%
plot_ly(x = cut, y = n, type = "bar", marker = list(color = toRGB("black")))

# mapping a color variable
ggplot2::diamonds %>% count(cut, clarity) %>%
plot_ly(x = cut, y = n, type = "bar", color = clarity)

# ----------------------------------------------------------------------
# https://plotly.com/r/box-plots/
# ----------------------------------------------------------------------

library(plotly)
#' basic boxplot
plot_ly(y = rnorm(50), type = "box") %>%
plot_ly(y = rnorm(50), type = "box", boxpoints = "all", jitter = 0.3,
pointpos = -1.8)
#' several box plots
plot_ly(ggplot2::diamonds, y = price, color = cut, type = "box")

#' grouped box plots
plot_ly(ggplot2::diamonds, x = cut, y = price, color = clarity, type = "box") %>%
layout(boxmode = "group")

# ----------------------------------------------------------------------
# https://plotly.com/r/bubble-charts/
# ----------------------------------------------------------------------

library(plotly)
d <- diamonds[sample(nrow(diamonds), 1000), ]
# note how size is automatically scaled and added as hover text
plot_ly(d, x = carat, y = price, size = carat, mode = "markers")

plot_ly(d, x = carat, y = price, text = paste("Clarity: ", clarity),
mode = "markers", color = carat, size = carat, opacity = carat)

# ----------------------------------------------------------------------
# https://plotly.com/r/contour-plots/
# ----------------------------------------------------------------------

#' Basic contour
library(plotly)
plot_ly(z = volcano, type = "contour")

x <- rnorm(200)
y <- rnorm(200)
p1 <- plot_ly(x = x, type = "histogram", showlegend = FALSE)
p2 <- plot_ly(x = x, y = y, type = "histogram2dcontour")
p3 <- plot_ly(y = y, type = "histogram", showlegend = FALSE)
a1 <- list(domain = c(0, .85))
a2 <- list(domain = c(.85, 1))
hide <- list(title = "", showticklabels = FALSE)
subplot(
layout(p1, xaxis = c(a1, hide), yaxis = a2),
layout(p2, xaxis = a1, yaxis = a1),
layout(p3, xaxis = a2, yaxis = c(a1, hide))
)

# ----------------------------------------------------------------------
# https://plotly.com/r/error-bars/
# ----------------------------------------------------------------------

library(dplyr)
library(plotly)

p <- ggplot2::mpg %>% group_by(class) %>%
summarise(mn = mean(hwy), sd = 1.96 * sd(hwy)) %>%
arrange(desc(mn)) %>%
plot_ly(x = class, y = mn, error_y = list(value = sd),
mode = "markers", name = "Highway") %>%
layout(yaxis = list(title = "Miles Per Gallon"))
p

df2 <- mpg %>% group_by(class) %>%
summarise(mn = mean(cty), sd = 1.96 * sd(cty))

add_trace(p, y = mn, error_y = list(value = sd),
name = "City", data = df2)

# ----------------------------------------------------------------------
# https://plotly.com/r/heatmaps/
# ----------------------------------------------------------------------

library(plotly)
plot_ly(z = volcano, type = "heatmap")

#' categorical x/y axis
m <- matrix(rnorm(9), nrow = 3, ncol = 3)
plot_ly(z = m, x = c("a", "b", "c"), y = c("d", "e", "f"), type = "heatmap")

#' Sequential Colorscales (Hot)
plot_ly(z = volcano, colorscale = "Hot", type = "heatmap")

#' Sequential Colorscales (Greys)
plot_ly(z = volcano, colorscale = "Greys", type = "heatmap")

#' Sequential Colorscales (Greens)
plot_ly(z = volcano, colorscale = "Greens", type = "heatmap")

#' Custom colorscale via scales package
vals <- unique(scales::rescale(c(volcano)))
o <- order(vals, decreasing = FALSE)
cols <- scales::col_numeric("Blues", domain = NULL)(vals)
colz <- setNames(data.frame(vals[o], cols[o]), NULL)
plot_ly(z = volcano, colorscale = colz, type = "heatmap")

library(viridis)
plot_ly(z = volcano, colors = viridis(256), type = "heatmap")

# ----------------------------------------------------------------------
# https://plotly.com/r/2D-Histogram/
# ----------------------------------------------------------------------

library(plotly)
s <- matrix(c(1, -.75, -.75, 1), ncol = 2)
obs <- mvtnorm::rmvnorm(500, sigma = s)
plot_ly(x = obs[,1], y = obs[,2], type = "histogram2d")

# ----------------------------------------------------------------------
# https://plotly.com/r/histograms/
# ----------------------------------------------------------------------

#' Basic histogram
plot_ly(x = rnorm(50), type = "histogram")

#' Vertical histogram
plot_ly(y = rnorm(50), type = "histogram")

#' Overlayed histograms
plot_ly(x = rnorm(500), opacity = 0.6, type = "histogram") %>%

# ----------------------------------------------------------------------
# https://plotly.com/r/line-and-scatter/
# ----------------------------------------------------------------------

#' Simple scatterplot
plot_ly(data = iris, x = Sepal.Length, y = Petal.Length, mode = "markers")

#' Scatterplot with qualitative colorscale
plot_ly(data = iris, x = Sepal.Length, y = Petal.Length, color = Species,
mode = "markers")

#' colors argument accepts colorbrewer2.org palette names
plot_ly(data = iris, x = Sepal.Length, y = Petal.Length, color = Species,
colors = "Set1", mode = "markers")
#' By default, colors will 'span the gamut'
# scales::show_col(RColorBrewer::brewer.pal("Set1"))

#' If you want finer control over the color scheme, you can pass
#' RGB or hex color codes directly to colors
pal <- RColorBrewer::brewer.pal(nlevels(iris$Species), "Set1") plot_ly(data = iris, x = Sepal.Length, y = Petal.Length, color = Species, colors = pal, mode = "markers") #' Scatterplot with sequential colorscale plot_ly(data = iris, x = Sepal.Length, y = Petal.Length, color = Petal.Width, mode = "markers") #' Basic time-series (line) plot with loess smooth plot_ly(economics, x = date, y = uempmed, name = "unemployment") add_trace(y = fitted(loess(uempmed ~ as.numeric(date)))) #' Density plot dens <- with(diamonds, tapply(price, INDEX = cut, density)) df <- data.frame( x = unlist(lapply(dens, "[[", "x")), y = unlist(lapply(dens, "[[", "y")), cut = rep(names(dens), each = length(dens[[1]]$x))
)
plot_ly(df, x = x, y = y, color = cut)

#' Different line interpolation options
x <- 1:5
y <- c(1, 3, 2, 3, 1)
plot_ly(x = x, y = y, name = "linear", line = list(shape = "linear")) %>%
add_trace(y = y + 5, name = "spline", line = list(shape = "spline")) %>%
add_trace(y = y + 10, name = "vhv", line = list(shape = "vhv")) %>%
add_trace(y = y + 15, name = "hvh", line = list(shape = "hvh")) %>%
add_trace(y = y + 20, name = "vh", line = list(shape = "vh")) %>%
add_trace(y = y + 25, name = "hv", line = list(shape = "hv"))

# ----------------------------------------------------------------------
# https://plotly.com/r/log-plot/
# ----------------------------------------------------------------------

d <- diamonds[sample(nrow(diamonds), 1000), ]

#' Without log scales
(p <- plot_ly(d, x = carat, y = price, mode = "markers"))

#' With log scales
layout(p, xaxis = list(type = "log", autorange = T),
yaxis = list(type = "log", autorange = T))

# ---------------------------------------------------------------------
# https://plotly.com/r/graphing-multiple-chart-types/
# ----------------------------------------------------------------------

#' Scatterplot with loess smoother

library(plotly)
mtcars <- mtcars[order(mtcars$disp), ] p <- plot_ly(mtcars, x = disp, y = mpg, mode = "markers", text = rownames(mtcars), showlegend = FALSE) add_trace(p, y = fitted(loess(mpg ~ disp)), mode = "lines", name = "loess smoother", showlegend = TRUE) #' Scatterplot with loess smoother and it's uncertaincy estimates m <- loess(mpg ~ disp, data = mtcars) f <- with(predict(m, se = TRUE), data.frame(fit, se.fit)) l <- list( color = toRGB("gray90", alpha = 0.3), fillcolor = toRGB("gray90", alpha = 0.3) ) p %>% add_trace(p, data = f, y = fit, mode = "lines") %>% add_trace(p, data = f, y = fit + 1.96 * se.fit, mode = "lines", fill = "tonexty", line = l) %>% add_trace(p, data = f, y = fit - 1.96 * se.fit, mode = "lines", fill = "tonexty", line = l) # ---------------------------------------------------------------------- # https://plotly.com/r/polar-chart/ # ---------------------------------------------------------------------- p <- plot_ly(plotly::mic, r = r, t = t, color = nms, mode = "lines") layout(p, title = "Mic Patterns", orientation = -90) p <- plot_ly(plotly::hobbs, r = r, t = t, color = nms, opacity = 0.7, mode = "markers") layout(p, title = "Hobbs-Pearson Trials", plot_bgcolor = toRGB("grey90")) p <- plot_ly(plotly::wind, r = r, t = t, color = nms, type = "area") layout(p, radialaxis = list(ticksuffix = "%"), orientation = 270) # ---------------------------------------------------------------------- # https://plotly.com/r/time-series/ # ---------------------------------------------------------------------- #' POSIXlt date/time class now_lt <- as.POSIXlt(Sys.time(), tz = "GMT") tm <- seq(0, 600, by = 10) x <- now_lt - tm y <- rnorm(length(x)) plot_ly(x = x, y = y, text = paste(tm, "seconds from now in GMT")) #' POSIXct date/time class now_ct <- as.POSIXct(Sys.time()) tm <- seq(0, 600, by = 10) x <- now_ct - tm y <- rnorm(length(x)) plot_ly(x = x, y = y, text = paste(tm, "seconds from now in", Sys.timezone())) #' Dates today <- Sys.Date() tm <- seq(0, 600, by = 10) x <- today - tm y <- rnorm(length(x)) plot_ly(x = x, y = y, text = paste(tm, "days from today")) # ---------------------------------------------------------------------------- # https://plotly.com/r/choropleth-maps/ (new) # ---------------------------------------------------------------------------- #' World Choropleth Map df <- read.csv("https://raw.githubusercontent.com/plotly/datasets/master/2011_us_ag_exports.csv") df$hover <- with(df, paste(state, '<br>', "Beef", beef, "Dairy", dairy, "<br>",
"Fruits", total.fruits, "Veggies", total.veggies,
"<br>", "Wheat", wheat, "Corn", corn))
# give state boundaries a white border
l <- list(
color = toRGB("white"),
width = 2
)
# specify some map projection/options
g <- list(
scope = 'usa',
projection = list(type = 'albers usa'),
showlakes = TRUE,
lakecolor = toRGB('white')
)

plot_ly(df, z = total.exports, text = hover, locations = code, type = 'choropleth',
locationmode = 'USA-states', color = total.exports, colors = 'Purples',
marker = list(line = l), colorbar = list(title = "Millions USD")) %>%
layout(title = '2011 US Agriculture Exports by State<br>(Hover for breakdown)', geo = g)

#' World Choropleth Map

# light grey boundaries
l <- list(
color = toRGB("grey"),
width = 0.5
)

# specify map projection/options
g <- list(
showframe = FALSE,
showcoastlines = FALSE,
projection = list(type = 'Mercator')
)

plot_ly(df, z = GDP..BILLIONS., text = COUNTRY, locations = CODE, type = 'choropleth',
color = GDP..BILLIONS., colors = 'Blues', marker = list(line = l),
colorbar = list(tickprefix = '$', title = 'GDP Billions US$')) %>%
layout(title = '2014 Global GDP<br>Source:<a href="https://www.cia.gov/library/publications/the-world-factbook/fields/2195.html">CIA World Factbook</a>',
geo = g)

#' Choropleth Inset Map
# restrict from June to September
df <- subset(df, Month %in% 6:9)
# ordered factor variable with month abbreviations
df$abbrev <- ordered(month.abb[df$Month], levels = month.abb[6:9])
# September totals
df9 <- subset(df, Month == 9)

# common plot options
g <- list(
scope = 'africa',
showframe = F,
showland = T,
landcolor = toRGB("grey90")
)

g1 <- c(
g,
resolution = 50,
showcoastlines = T,
countrycolor = toRGB("white"),
coastlinecolor = toRGB("white"),
projection = list(type = 'Mercator'),
list(lonaxis = list(range = c(-15, -5))),
list(lataxis = list(range = c(0, 12))),
list(domain = list(x = c(0, 1), y = c(0, 1)))
)

g2 <- c(
g,
showcountries = F,
bgcolor = toRGB("white", alpha = 0),
list(domain = list(x = c(0, .6), y = c(0, .6)))
)

plot_ly(df, type = 'scattergeo', mode = 'markers', locations = Country,
locationmode = 'country names', text = paste(Value, "cases"),
color = as.ordered(abbrev), marker = list(size = Value/50)) %>%
add_trace(type = 'scattergeo', mode = 'text', geo = 'geo2', showlegend = F,
lon = 21.0936, lat = 7.1881, text = 'Africa') %>%
add_trace(type = 'choropleth', locations = Country, locationmode = 'country names',
z = Month, colors = "black", showscale = F, geo = 'geo2', data = df9) %>%
layout(title = 'Ebola cases reported by month in West Africa 2014<br> Source: <a href="https://data.hdx.rwlabs.org/dataset/rowca-ebola-cases">HDX</a>',
geo = g1, geo2 = g2)

# ----------------------------------------------------------------------------
#  https://plotly.com/r/lines-on-maps/ (new)
# ----------------------------------------------------------------------------

#' US Flight Paths Map

# airport locations
# flights between airports
flights$id <- seq_len(nrow(flights)) # map projection geo <- list( scope = 'north america', projection = list(type = 'azimuthal equal area'), showland = TRUE, landcolor = toRGB("gray95"), countrycolor = toRGB("gray80") ) plot_ly(air, lon = long, lat = lat, text = airport, type = 'scattergeo', locationmode = 'USA-states', marker = list(size = 2, color = 'red')) %>% add_trace(lon = list(start_lon, end_lon), lat = list(start_lat, end_lat), group = id, opacity = cnt/max(cnt), data = flights, mode = 'lines', line = list(width = 1, color = 'red'), type = 'scattergeo', locationmode = 'USA-states') %>% layout(title = 'Feb. 2011 American Airline flight paths<br>(Hover for airport names)', geo = geo, showlegend = FALSE) #' London to NYC Great Circle library(plotly) plot_ly(lat = c(40.7127, 51.5072), lon = c(-74.0059, 0.1275), type = 'scattergeo', mode = 'lines', line = list(width = 2, color = 'blue')) %>% layout( title = 'London to NYC Great Circle', showlegend = FALSE, geo = list( resolution = 50, showland = TRUE, showlakes = TRUE, landcolor = toRGB("grey80"), countrycolor = toRGB("grey80"), lakecolor = toRGB("white"), projection = list(type = "equirectangular"), coastlinewidth = 2, lataxis = list( range = c(20, 60), showgrid = TRUE, tickmode = "linear", dtick = 10 ), lonaxis = list( range = c(-100, 20), showgrid = TRUE, tickmode = "linear", dtick = 20 ) ) ) #' Contour lines on globe library(plotly) df <- read.csv('https://raw.githubusercontent.com/plotly/datasets/master/globe_contours.csv') df$id <- seq_len(nrow(df))

library(tidyr)
d <- df %>%
gather(key, value, -id) %>%
separate(key, c("l", "line"), "\\.") %>%

p <- plot_ly(type = 'scattergeo', mode = 'lines',
line = list(width = 2, color = 'violet'))

for (i in unique(d$line)) p <- add_trace(p, lat = lat, lon = lon, data = subset(d, line == i)) geo <- list( showland = TRUE, showlakes = TRUE, showcountries = TRUE, showocean = TRUE, countrywidth = 0.5, landcolor = toRGB("grey90"), lakecolor = toRGB("white"), oceancolor = toRGB("white"), projection = list( type = 'orthographic', rotation = list( lon = -100, lat = 40, roll = 0 ) ), lonaxis = list( showgrid = TRUE, gridcolor = toRGB("gray40"), gridwidth = 0.5 ), lataxis = list( showgrid = TRUE, gridcolor = toRGB("gray40"), gridwidth = 0.5 ) ) layout(p, showlegend = FALSE, geo = geo, title = 'Contour lines over globe<br>(Click and drag to rotate)') # ---------------------------------------------------------------------------- # https://plotly.com/r/scatter-plots-on-maps/ (new) # ---------------------------------------------------------------------------- #' US Airports Map library(plotly) df <- read.csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_us_airport_traffic.csv') df$hover <- with(df, paste(airport, city, state, "Arrivals: ", cnt))

# marker styling
m <- list(
colorbar = list(title = "Incoming flights February 2011"),
size = 8, opacity = 0.8, symbol = 'square'
)

# geo styling
g <- list(
scope = 'usa',
projection = list(type = 'albers usa'),
showland = TRUE,
landcolor = toRGB("gray95"),
subunitcolor = toRGB("gray85"),
countrycolor = toRGB("gray85"),
countrywidth = 0.5,
subunitwidth = 0.5
)

plot_ly(df, lat = lat, lon = long, text = hover, color = cnt,
type = 'scattergeo', locationmode = 'USA-states', mode = 'markers',
marker = m) %>%
layout(title = 'Most trafficked US airports<br>(Hover for airport)', geo = g)

#' North American Precipitation Map
library(plotly)
df$hover <- paste(df$Globvalue, "inches")

# change default color scale title
m <- list(colorbar = list(title = "Total Inches"))

# geo styling
g <- list(
scope = 'north america',
showland = TRUE,
landcolor = toRGB("grey83"),
subunitcolor = toRGB("white"),
countrycolor = toRGB("white"),
showlakes = TRUE,
lakecolor = toRGB("white"),
showsubunits = TRUE,
showcountries = TRUE,
resolution = 50,
projection = list(
type = 'conic conformal',
rotation = list(
lon = -100
)
),
lonaxis = list(
showgrid = TRUE,
gridwidth = 0.5,
range = c(-140, -55),
dtick = 5
),
lataxis = list(
showgrid = TRUE,
gridwidth = 0.5,
range = c(20, 60),
dtick = 5
)
)

plot_ly(df, lat = Lat, lon = Lon, text = hover, color = Globvalue,
type = 'scattergeo', marker = m) %>%
layout(title = 'US Precipitation 06-30-2015<br>Source: NOAA', geo = g)

# ----------------------------------------------------------------------------
#  https://plotly.com/r/bubble-maps/ (new)
# ----------------------------------------------------------------------------

#' United States Bubble Map
library(plotly)
df$hover <- paste(df$name, "Population", df$pop/1e6, " million") df$q <- with(df, cut(pop, quantile(pop)))
levels(df$q) <- paste(c("1st", "2nd", "3rd", "4th", "5th"), "Quantile") df$q <- as.ordered(df$q) g <- list( scope = 'usa', projection = list(type = 'albers usa'), showland = TRUE, landcolor = toRGB("gray85"), subunitwidth = 1, countrywidth = 1, subunitcolor = toRGB("white"), countrycolor = toRGB("white") ) plot_ly(df, lon = lon, lat = lat, text = hover, marker = list(size = sqrt(pop/10000) + 1), color = q, type = 'scattergeo', locationmode = 'USA-states') %>% layout(title = '2014 US city populations<br>(Click legend to toggle)', geo = g) #' Ebola Cases in West Africa # see 'Choropleth Inset Map' example # ---------------------------------------------------------------------------- # https://plotly.com/r/map-subplots-and-small-multiples/ (new) # ---------------------------------------------------------------------------- #' US map small multiples library(plotly) df <- read.csv('https://raw.githubusercontent.com/plotly/datasets/master/1962_2006_walmart_store_openings.csv') # common map properties g <- list( scope = 'usa', showland = T, landcolor = toRGB("gray90"), showcountries = F, subunitcolor = toRGB("white") ) # year text labels yrs <- unique(df$YEAR)
id <- seq_along(yrs)
df2 <- data.frame(
YEAR = yrs,
id = id
)

# id for anchoring traces on different plots
df$id <- as.integer(factor(df$YEAR))

p <- plot_ly(df, type = 'scattergeo', lon = LON, lat = LAT, group = YEAR,
geo = paste0("geo", id), showlegend = F,
marker = list(color = toRGB("blue"), opacity = 0.5)) %>%
add_trace(lon = -78, lat = 47, mode = 'text', group = YEAR,
geo = paste0("geo", id), text = YEAR, data = df2) %>%
layout(title = 'New Walmart Stores per year 1962-2006<br> Source: <a href="http://www.econ.umn.edu/~holmes/data/WalMart/index.html">University of Minnesota</a>',
geo = g,
autosize = F,
width = 1000,
height = 900,
hovermode = F)

subplot(p, nrows = 9)

################################################################################
# Multiple Axes, Subplots, and Insets (https://plotly.com/r/#multiple-axes-subplots-and-insets)
################################################################################

# ----------------------------------------------------------------------------
# https://plotly.com/r/subplots/
# ----------------------------------------------------------------------------

#' Basic subplot
library(plotly)
subplot(
plot_ly(economics, x = date, y = uempmed),
plot_ly(economics, x = date, y = unemploy),
margin = 0.05
) %>% layout(showlegend = FALSE)

#' Sharing an axis
subplot(
plot_ly(economics, x = date, y = uempmed),
plot_ly(economics, x = date, y = unemploy),
margin = 0.03,
nrows = 2,
# fyi, share doesn't work (yet)
share = "x"
) %>% layout(showlegend = FALSE)

# ----------------------------------------------------------------------------
# https://plotly.com/r/multiple-axes/
# ----------------------------------------------------------------------------

library(plotly)
ay <- list(
tickfont = list(color = "red"),
overlaying = "y",
side = "right"
)
plot_ly(x = 1:3, y = 10*(1:3), name = "slope of 10") %>%
add_trace(x = 2:4, y = 1:3, name = "slope of 1", yaxis = "y2") %>%
layout(title = "Double Y Axis", yaxis2 = ay)

# ----------------------------------------------------------------------------
# https://plotly.com/r/insets/
# ----------------------------------------------------------------------------

p1 <- plot_ly(x = c(1, 2, 3), y = c(4, 3, 2))
p2 <- plot_ly(x = c(20, 30, 40), y = c(30, 40, 50)) %>%
layout(xaxis = list(domain = c(0.6, 0.95)),
yaxis = list(domain = c(0.6, 0.95)))
subplot(p1, p2)

################################################################################
# Layout Options
################################################################################

# ----------------------------------------------------------------------------
# https://plotly.com/r/setting-graph-size/
# ----------------------------------------------------------------------------

library(plotly)
m = list(
l = 50,
r = 50,
b = 100,
t = 100,
)
plot_ly(x = seq(0, 8), y = seq(0, 8)) %>%
layout(autosize = F, width = 500, height = 500, margin = m)

# ----------------------------------------------------------------------------
# https://plotly.com/r/legend/
# ----------------------------------------------------------------------------

#' Legend Names
library(plotly)
p <- plot_ly(x = seq(0, 8), y = rnorm(8), name = "Blue Trace") %>%
add_trace(y = rnorm(8), name = "Orange Trace")
p

#' Hiding the Legend
p %>% layout(showlegend = FALSE)

#' Positioning the Legend
p %>% layout(legend = list(x = 0.5, y = 0))

#' Styling the Legend
f <- list(
family = "sans-serif",
size = 12,
color = "#000"
)
l <- list(
font = f,
bgcolor = "#E2E2E2",
bordercolor = "#FFFFFF",
borderwidth = 2
)
p %>% layout(legend = l)

#' Hiding Legend Entries
plot_ly(x = seq(0, 8), y = rnorm(8), showlegend = FALSE) %>%
add_trace(y = rnorm(8), name = "Orange Trace", showlegend = TRUE)

# ----------------------------------------------------------------------------
# https://plotly.com/r/LaTeX/
# ----------------------------------------------------------------------------

library(plotly)
plot_ly(x = c(1, 2, 3, 4), y = c(1, 4, 9, 16),
name = "$\\alpha_{1c} = 352 \\pm 11 \\text{ km s}^{-1}$") %>%
add_trace(x = c(1, 2, 3, 4), y = c(0.5, 2, 4.5, 8),
name = "$\\beta_{1c} = 25 \\pm 11 \\text{ km s}^{-1}$") %>%
layout(xaxis = list(title = "$\\sqrt{(n_\\text{c}(t|{T_\\text{early}}))}$"),
yaxis = list(title = "$d, r \\text{ (solar radius)}$"))

# ----------------------------------------------------------------------------
# https://plotly.com/r/figure-labels/
# ----------------------------------------------------------------------------

library(plotly)
f <- list(
family = "Courier New, monospace",
size = 18,
color = "#7f7f7f"
)
x <- list(
title = "x Axis",
titlefont = f
)
y <- list(
title = "y Axis",
titlefont = f
)
plot_ly(x = rnorm(10), y = rnorm(10), mode = "markers") %>%
layout(xaxis = x, yaxis = y)

# ----------------------------------------------------------------------------
# https://plotly.com/r/font/
# ----------------------------------------------------------------------------

library(plotly)
f <- list(
family = "Courier New, monospace",
size = 18,
color = "#7f7f7f"
)
plot_ly(x = 0:8, y = 0:8) %>%
layout(title = "Global Font", font = f)

# ----------------------------------------------------------------------------
# https://plotly.com/r/axes/
# ----------------------------------------------------------------------------

#' Style Axes Ticks and Placement

library(plotly)
a <- list(
autotick = FALSE,
ticks = "outside",
tick0 = 0,
dtick = 0.25,
ticklen = 5,
tickwidth = 2,
tickcolor = toRGB("blue")
)
s <- seq(1, 4, by = 0.25)
plot_ly(x = s, y = s) %>%
layout(xaxis = a, yaxis = a)

#' Style Axes Title and Ticks Labels

library(plotly)
f1 <- list(
family = "Arial, sans-serif",
size = 18,
color = "lightgrey"
)
f2 <- list(
family = "Old Standard TT, serif",
size = 14,
color = "black"
)
a <- list(
title = "AXIS TITLE",
titlefont = f1,
showticklabels = TRUE,
tickangle = 45,
tickfont = f2,
exponentformat = "e",
showexponent = "All"
)

s <- seq(0, 8)
plot_ly(x = s, y = s) %>%
layout(xaxis = a, yaxis = a, showlegend = FALSE)

#' Style Axes and the Zero-Line

library(plotly)
ax <- list(
zeroline = TRUE,
showline = TRUE,
mirror = "ticks",
gridcolor = toRGB("gray50"),
gridwidth = 2,
zerolinecolor = toRGB("red"),
zerolinewidth = 4,
linecolor = toRGB("black"),
linewidth = 6
)
s <- seq(-1, 4)
plot_ly(x = s, y = s) %>%
layout(xaxis = ax, yaxis = ax)

#' Hide Axes Title, Lines, Ticks, and Labels

library(plotly)
ax <- list(
title = "",
zeroline = FALSE,
showline = FALSE,
showticklabels = FALSE,
showgrid = FALSE
)

plot_ly(x = c(1, 2), y = c(1, 2)) %>%
layout(xaxis = ax, yaxis = ax)

#' Reversed Axes

library(plotly)
plot_ly(x = c(1, 2), y = c(1, 2)) %>%
layout(xaxis = list(autorange = "reversed"))

#' Logarithmic Axes

library(plotly)
s <- seq(1, 8)
plot_ly(x = s, y = exp(s), name = "exponential") %>%
add_trace(y =  s, name = "linear") %>%
layout(yaxis = list(type = "log"))

#' Rangemode

library(plotly)
plot_ly(x = seq(2, 6, by = 2), y = seq(-3, 3, by = 3)) %>%
layout(
xaxis = list(rangemode = "tozero"),
yaxis = list(rangemode = "nonnegative")
)

#' Manual ranges

library(plotly)
s <- seq(1, 8)
plot_ly(x = s, y = s) %>%
layout(
xaxis = list(range = c(2, 5)),
yaxis = list(range = c(2, 5))
)

# ----------------------------------------------------------------------------
# https://plotly.com/r/text-and-annotations/
# ----------------------------------------------------------------------------

#' Text mode
plot_ly(mtcars, x = wt, y = mpg, text = rownames(mtcars), mode = "text")

#' Styling text
t <- list(
family = "sans serif",
size = 18,
color = toRGB("grey50")
)
plot_ly(mtcars, x = wt, y = mpg, text = rownames(mtcars), mode = "markers+text",
textfont = t, textposition = "top middle")

#' Show custom text on hover
plot_ly(mtcars, x = wt, y = mpg, text = rownames(mtcars), mode = "markers")

#' Single Annotation

m <- mtcars[which.max(mtcars$mpg), ] a <- list( x = m$wt,
y = m$mpg, text = rownames(m), xref = "x", yref = "y", showarrow = TRUE, arrowhead = 7, ax = 20, ay = -40 ) plot_ly(mtcars, x = wt, y = mpg, mode = "markers") %>% layout(annotations = a) #' Styling and Coloring Annotations m <- mtcars[which.max(mtcars$mpg), ]

f <- list(
family = "sans serif",
size = 18,
color = toRGB("white")
)

a <- list(
textposition = "top right",
font = f,
x = m$wt, y = m$mpg,
text = rownames(m),
xref = "x",
yref = "y",
ax = 20,
ay = -40,
align = "center",
arrowsize = 1,
arrowwidth = 2,
arrowcolor = toRGB("lightblue"),
bordercolor = toRGB("gray50"),
borderwidth = 2,
bgcolor = toRGB("blue"),
opacity = 0.8
)

plot_ly(mtcars, x = wt, y = mpg, mode = "markers") %>%
layout(annotations = a)

#' Many Annotations

a <- list()
for (i in seq_len(nrow(mtcars))) {
m <- mtcars[i, ]
a[[i]] <- list(
x = m$wt, y = m$mpg,
text = rownames(m),
xref = "x",
yref = "y",
showarrow = TRUE,
ax = 20,
ay = -40
)
}
# could be improved with label dodging, but how to measure text height/width?
plot_ly() %>% layout(annotations = a)

################################################################################
# File Settings
################################################################################

# ----------------------------------------------------------------------------
# https://plotly.com/r/privacy/
# ----------------------------------------------------------------------------

library(plotly)

#' public
plot_ly(x = c(0, 2, 4), y = c(0, 4, 2))

#' private
plot_ly(x = c(0, 2, 4), y = c(0, 4, 2), world_readable = FALSE)

# another option is to "build" the plot, then tack on these properties
p <- plot_ly(x = c(0, 2, 4), y = c(0, 4, 2))
p <- plotly_build(p)
p

# ----------------------------------------------------------------------------
# https://plotly.com/r/file-options/
# ----------------------------------------------------------------------------

library(plotly)

# By default, everytime you print a plotly object, it will create a new file
plot_ly(x = c(1, 2), y = c(1, 2), filename = "myPlot")

# There are a couple ways to prevent a new file from being created
# (1) Use get_figure() to obtain a figure object.
fig <- get_figure("cpsievert", "559")
# Then modify and print that object (this will only work if you have proper credentials)
layout(fig, title = paste("Modified on ", Sys.time()))

# (2) If you know the filename attached to the plot you want to modify,
# place that name in filename and specify fileopt to overwrite that file
plot_ly(x = c(1, 2), y = c(1, 2), filename = "myPlot", fileopt = "overwrite")

# NOTE: filenames that contain "/" be treated as a Plotly directory and will be saved to your Plotly account in a folder tree. For example, to save your graphs to the folder my-graphs:

################################################################################
# Get Requests, Static Image Export, and Interactive Embedding  (https://plotly.com/r/#get-requests-static-image-export)
################################################################################

# ----------------------------------------------------------------------------
# https://plotly.com/r/embedding-plotly-graphs-in-HTML/
# ----------------------------------------------------------------------------

# Maybe copy/paste relevant bits from this vignette? ->
# https://github.com/ropensci/plotly/blob/carson-dsl/vignettes/intro.Rmd

# ----------------------------------------------------------------------------
# https://plotly.com/r/shiny-tutorial/
# ----------------------------------------------------------------------------

# Maybe link to an updated version of this blog post?
# http://moderndata.plot.ly/dashboards-in-r-with-shiny-plotly/

# If we want, we could copy/paste source from this folder ->
# https://github.com/ropensci/plotly/tree/carson-dsl/inst/examples

# ----------------------------------------------------------------------------
# https://plotly.com/r/get-requests/
# ----------------------------------------------------------------------------

fig <- get_figure("cpsievert", "559")
layout(fig, title = paste("Modified on ", Sys.time()))

################################################################################
# Miscellaneous
################################################################################

# ----------------------------------------------------------------------------
# https://plotly.com/r/static-image-export/ (currently no R page)
# ----------------------------------------------------------------------------

# Use the curl package to download a static image of any publicly viewable figure
library(curl)