tsibbletalk

R build status

A tsibble consists of index, key, and other measured variables. The key identifies series/panels of interests, which often remain the same during the exploration loop. Understanding multi-faceted data requires an ensemble of graphics, and linked brushing via key will accelerate the exploratory data visualisation process. The {tsibbletalk} package introduces shared key to the tsibble, to easily {crosstalk} between plots on both client and server sides (i.e. with or without shiny).

Installation

You can install the development version of tsibbletalk from GitHub with:

# install.packages("remotes")
remotes::install_github("earowang/tsibbletalk")

Get started

Linking views via shared tsibble

The as_shared_tsibble() turns a tsibble object to a shared tsibble. If there’s any nesting/hierarchical structure in the key variables, the spec argument should be supplied for the structural specification. For example, the structure in the tourism data contains the geographical hierarchy, State nesting (/) lower-level Regions, and each location crossed (*) with the trip Purpose. The plotly_key_tree() visualises the tree structure specified in the spec, which is helpful in navigating interested series for later.

library(tsibble)
library(tsibbletalk)
tourism_shared <- tourism %>%
  as_shared_tsibble(spec = (State / Region) * Purpose)
p0 <- plotly_key_tree(tourism_shared, height = 900, width = 600)

Multiple displays are constructed: (1) the overall tree plot in the left panel, (2) the time series plot in the top right, and (3) the scatterplot representing featured metrics for each series, produced by the features(). All known functions here, but (yes) generate linking views.

library(feasts)
tourism_feat <- tourism_shared %>%
  features(Trips, feat_stl)

library(ggplot2)
p1 <- tourism_shared %>%
  ggplot(aes(x = Quarter, y = Trips)) +
  geom_line(aes(group = Region), alpha = 0.5) +
  facet_wrap(~ Purpose, scales = "free_y")
p2 <- tourism_feat %>%
  ggplot(aes(x = trend_strength, y = seasonal_strength_year)) +
  geom_point(aes(group = Region))

library(plotly)
subplot(p0,
  subplot(
    ggplotly(p1, tooltip = "Region", width = 900),
    ggplotly(p2, tooltip = "Region", width = 900),
    nrows = 2),
  widths = c(.4, .6)) %>%
  highlight(dynamic = TRUE)

Slicing and dicing on server-side

The key carries nested and crossed embedding, and the index provides temporal information. Slicing and dicing time index can help to build richer profiles for each series. A shiny module, a pair of UI and server functions, is provided to interactively slice and dice a tsibble. This allows to quickly locate an interesting slice in time.

p <- fill_gaps(pedestrian) %>%
  filter_index(~ "2015") %>% 
  ggplot(aes(x = Date_Time, y = Count, colour = Sensor)) +
  geom_line(size = .2) +
  facet_wrap(~ Sensor, scales = "free_y") +
  theme(legend.position = "none")

library(shiny)
ui <- fluidPage(tsibbleWrapUI("tswrap"))
server <- function(input, output, session) {
  tsibbleWrapServer("tswrap", p, period = "1 day")
}
shinyApp(ui, server)