Today we are going to discuss a number of additional examples of using plotly.
To get started, plotly uses htmlwidgets. Take a look at the htmlwidgets website and give a few examples a try.
plotly uses htmlwidgets. So we should become familiar with them.
Using leaflet to make maps.
require(leaflet)
## Loading required package: leaflet
m <- leaflet() %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R")
m # Print the map
Go to google and ask for the location of CSU East Bay. Search for “CSU East Bay lat and long”
Answer: 37.6571° N, 122.0574° W
m <- leaflet() %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addMarkers(lng=37.6571 , lat=122.05747, popup="CSU East Bay?")
m # Print the map
That is totally wrong.
m <- leaflet() %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addMarkers(lng=122.0574, lat=37.6571, popup="CSU East Bay?")
m # Print the map
Still wrong, but at least we are on the planet now.
m <- leaflet() %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addMarkers(lng=-122.0574, lat=37.6571, popup="CSU East Bay")
m # Print the map
Here is a link to the google developer page about lat and long. Key thing is lat comes before long.
m <- leaflet() %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addMarkers(lat=37.6571, lng=-122.0574, popup="CSU East Bay")
m # Print the map
Here is the link to Google Maps API.
Finally here is OpenStreetMap. This is where the maps come from for leaflet. Can you use googlemaps?
plotly is given as a example.
require(ggplot2)
## Loading required package: ggplot2
require(plotly)
## Loading required package: plotly
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
p <- ggplot(data = diamonds, aes(x = cut, fill = clarity)) +
geom_bar(position = "dodge")
ggplotly(p)
d <- diamonds[sample(nrow(diamonds), 500), ]
plot_ly(d, x = d$carat, y = d$price,
text = paste("Clarity: ", d$clarity),
mode = "markers", color = d$carat, size = d$carat)
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plot.ly/r/reference/#scatter
## Warning: `line.width` does not currently support multiple values.
The python ploting library rbokeh.
library(rbokeh)
figure() %>%
ly_points(Sepal.Length, Sepal.Width, data = iris,
color = Species, glyph = Species,
hover = list(Sepal.Length, Sepal.Width))
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
## Warning in structure(x, class = unique(c("AsIs", oldClass(x)))): Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes.
## Consider 'structure(list(), *)' instead.
visNetwork.
library(networkD3)
##
## Attaching package: 'networkD3'
## The following object is masked from 'package:leaflet':
##
## JS
data(MisLinks, MisNodes)
forceNetwork(Links = MisLinks, Nodes = MisNodes, Source = "source",
Target = "target", Value = "value", NodeID = "name",
Group = "group", opacity = 0.4)
Making tables DT.
library(DT)
##
## Attaching package: 'DT'
## The following object is masked from 'package:networkD3':
##
## JS
datatable(iris, options = list(pageLength = 5))
One more thing, flexdashboards which used shiny. Here is a one example geoms dash.
A case study of housing sales in Texas. See this page in the book.
This is a very nice case study. You should read the chapter and try all of the plots.
library(plotly)
txhousing
p <- ggplot(txhousing, aes(date, median)) +
geom_line(aes(group = city), alpha = 0.2)
p
## Warning: Removed 446 rows containing missing values (geom_path).
subplot(
p, ggplotly(p, tooltip = "city"),
ggplot(txhousing, aes(date, median)) + geom_bin2d(),
ggplot(txhousing, aes(date, median)) + geom_hex(),
nrows = 2, shareX = TRUE, shareY = TRUE,
titleY = FALSE, titleX = FALSE
)
## Warning: Removed 616 rows containing non-finite values (stat_bin2d).
## Warning: Removed 616 rows containing non-finite values (stat_binhex).
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
tx <- group_by(txhousing, city)
# initiate a plotly object with date on x and median on y
p <- plot_ly(tx, x = ~date, y = ~median)
# plotly_data() returns data associated with a plotly object
plotly_data(p)
p
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plot.ly/r/reference/#scatter
## No scatter mode specifed:
## Setting the mode to markers
## Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
## Warning: Ignoring 616 observations
# add a line highlighting houston
add_lines(
# plots one line per city since p knows city is a grouping variable
add_lines(p, alpha = 0.2, name = "Texan Cities", hoverinfo = "none"),
name = "Houston", data = filter(txhousing, city == "Houston")
)
allCities <- txhousing %>%
group_by(city) %>%
plot_ly(x = ~date, y = ~median) %>%
add_lines(alpha = 0.2, name = "Texan Cities", hoverinfo = "none")
allCities %>%
filter(city == "Houston") %>%
add_lines(name = "Houston")
allCities %>%
add_fun(function(plot) {
plot %>% filter(city == "Houston") %>% add_lines(name = "Houston")
}) %>%
add_fun(function(plot) {
plot %>% filter(city == "San Antonio") %>%
add_lines(name = "San Antonio")
})
Using a function.
# reusable function for highlighting a particular city
layer_city <- function(plot, name) {
plot %>% filter(city == name) %>% add_lines(name = name)
}
# reusable function for plotting overall median & IQR
layer_iqr <- function(plot) {
plot %>%
group_by(date) %>%
summarise(
q1 = quantile(median, 0.25, na.rm = TRUE),
m = median(median, na.rm = TRUE),
q3 = quantile(median, 0.75, na.rm = TRUE)
) %>%
add_lines(y = ~m, name = "median", color = I("black")) %>%
add_ribbons(ymin = ~q1, ymax = ~q3, name = "IQR", color = I("black"))
}
allCities %>%
add_fun(layer_iqr) %>%
add_fun(layer_city, "Houston") %>%
add_fun(layer_city, "San Antonio")
library(forecast)
layer_forecast <- function(plot) {
d <- plotly_data(plot)
series <- with(d,
ts(median, frequency = 12, start = c(2000, 1), end = c(2015, 7))
)
fore <- forecast(ets(series), h = 48, level = c(80, 95))
plot %>%
add_ribbons(x = time(fore$mean), ymin = fore$lower[, 2],
ymax = fore$upper[, 2], color = I("gray95"),
name = "95% confidence", inherit = FALSE) %>%
add_ribbons(x = time(fore$mean), ymin = fore$lower[, 1],
ymax = fore$upper[, 1], color = I("gray80"),
name = "80% confidence", inherit = FALSE) %>%
add_lines(x = time(fore$mean), y = fore$mean, color = I("blue"),
name = "prediction")
}
txhousing %>%
group_by(city) %>%
plot_ly(x = ~date, y = ~median) %>%
add_lines(alpha = 0.2, name = "Texan Cities", hoverinfo = "none") %>%
add_fun(layer_iqr) %>%
add_fun(layer_forecast)
p <- ggplot(fortify(gold), aes(x, y)) + geom_line()
gg <- ggplotly(p)
layout(gg, dragmode = "pan")
rangeslider(gg)
p <- ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point() + geom_smooth()
p %>%
ggplotly(layerData = 2, originalData = FALSE) %>%
plotly_data()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
p %>%
ggplotly(layerData = 2, originalData = F) %>%
add_fun(function(p) {
p %>% slice(which.max(se)) %>%
add_segments(x = ~x, xend = ~x, y = ~ymin, yend = ~ymax) %>%
add_annotations("Maximum uncertainty", ax = 60)
}) %>%
add_fun(function(p) {
p %>% slice(which.min(se)) %>%
add_segments(x = ~x, xend = ~x, y = ~ymin, yend = ~ymax) %>%
add_annotations("Minimum uncertainty")
})
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.
When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.