knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.path = file.path("man", "figures", ""), fig.height = 8, fig.width = 12 )
Cognostics are univariate statistics (or metrics) for a subset of data. When paired with the underlying data of visualizations, cognostics are a powerful tool for ordering and filtering the visualizations. add_panel_cogs()
will automatically append cognostics for each plot player in a given panel column. The newly appended data can be fed into a trelliscopejs widget for easy viewing.
You can install autocogs from github with:
remotes::install_github("schloerke/autocogs")
library(autocogs) library(tidyverse) library(gapminder) # remotes::install_github("hafen/trelliscopejs") # remotes::install_github("schloerke/trelliscopejs@autocogs") library(trelliscopejs) # Explore p <- ggplot(gapminder, aes(year, lifeExp)) + geom_line(aes(group = country)) + geom_smooth(method = "lm", formula = y ~ x) p
Looking at the plot above, most countries follow a linear trend: As the year increases, life expectancy goes up. A few countries do not follow a linear trend.
In the examples below, we will extract cognostics to aid in exploring the countries whose life expectancy is not linear.
trelliscopejs::facet_trelliscope()
ggplot(gapminder, aes(year, lifeExp)) + geom_smooth(method = "lm", formula = y ~ x) + geom_line() + trelliscopejs::facet_trelliscope( ~ country + continent, nrow = 3, ncol = 6, self_contained = TRUE, auto_cog = TRUE, state = list( # set the state to display the country, continent, and R^2 value # sorted by ascending R^2 value sort = list(trelliscopejs::sort_spec("_lm_r2")), labels = c("country", "continent", "_lm_r2") ), path = "readme-figs/facet" ) # (screen shot of trelliscopejs widget)
trelliscopejs::trelliscope()
This is a full, start to finish example how automatic cognostics could be inserted into a data exploration workflow.
# Find a consistent y range y_range <- range(gapminder$lifeExp) ## # Set up data and panel column gapminder %>% group_by(country, continent) %>% # nest the data according to the country and continent nest() %>% mutate( # create a column of plots with a # * line # * linear model panel = lapply(data, function(dt) { ggplot(dt, aes(year, lifeExp)) + geom_smooth(method = "lm", formula = y ~ x) + geom_line() + ylim(y_range[1], y_range[2]) }) ) %>% print() -> gap_data # Double check the plot worked... # Look at the first panel (ggplot2 plot) of Afghanistan gap_data$panel[[1]] #!!!!!!!!!! # Add cognostic information given the panel column plots #!!!!!!!!!! gap_data %>% autocogs::add_panel_cogs() %>% ungroup() %>% # double check it was added print(width = 100) -> full_gap_data # Display the panel and cognostics in a trelliscopejs widget trelliscopejs::trelliscope( full_gap_data, "gapminder life expectancy", panel_col = "panel", ncol = 6, nrow = 3, auto_cog = FALSE, self_contained = TRUE, state = list( # sort by ascending R^2 value (percent explained by linear model) sort = list(trelliscopejs::sort_spec("_lm_r2")), # display the country, continent, and R^2 value labels = c("country", "continent", "_lm_r2") ), path = "readme-figs/manually" ) # (screen shot of trelliscopejs widget)
add_cog_group()
to add a custom cognostics group.add_layer_cogs()
to call which cognostics groups should be executed for a given plot layer.Using existing code from the autocogs
package, we will add the univariate continuous cognostics group.
add_cog_group( "univariate_continuous", field_info("x", "continuous"), "univariate metrics for continuous data", function(x, ...) { x_range <- range(x, na.rm = TRUE) list( min = cog_desc(x_range[1], "minimum of non NA data"), max = cog_desc(x_range[2], "maximum of non NA data"), mean = cog_desc(mean(x, na.rm = TRUE), "mean of non NA data"), median = cog_desc(median(x, na.rm = TRUE), "median of non NA data"), var = cog_desc(var(x, na.rm = TRUE), "variance of non NA data") ) } )
We can then call the 'univariate_continuous'
cognostics group whenever a geom_rug
layer is added in a ggplot2 plot object using the code below.
add_layer_cogs( # load_all(); p <- qplot(x = 1, y = Sepal.Length, data = iris, geom = "boxplot"); plot_cogs(p) "geom_boxplot", "boxplot plot", cog_group_df( "univariate_continuous", "y", "_y", "boxplot", "y", "_boxplot", "univariate_counts", "y", "_n" ) )
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.