From fed48d447651768dea56cfcc6a8f2309638cd0d7 Mon Sep 17 00:00:00 2001 From: Bob Rudis Date: Mon, 13 Feb 2017 12:51:28 -0500 Subject: [PATCH 1/2] pre-CRAN flight check --- .Rbuildignore | 2 +- DESCRIPTION | 15 +- NAMESPACE | 3 +- R/coord_proj.r | 17 +-- R/formatters.r | 37 ++--- R/geom_dumbbell.R | 14 +- R/geom_table.r | 188 +++++++++++++------------ R/geom_twoway_bar.r | 151 ++++++++++---------- R/ggalt-package.r | 2 +- R/zzz.r | 4 +- README.Rmd | 10 +- README.md | 11 +- README_figs/README-dumbbell2-1.png | Bin 36136 -> 36078 bytes cran-comments.md | 17 +++ man/byte_format.Rd | 3 + man/coord_proj.Rd | 10 +- man/geom_dumbbell.Rd | 14 +- man/geom_twoway_bar.Rd | 55 -------- man/ggalt-ggproto.Rd | 4 +- vignettes/ggalt_examples.Rmd | 280 +++++++++++++++++++++++++++++++++++++ 20 files changed, 547 insertions(+), 290 deletions(-) create mode 100644 cran-comments.md delete mode 100644 man/geom_twoway_bar.Rd create mode 100644 vignettes/ggalt_examples.Rmd diff --git a/.Rbuildignore b/.Rbuildignore index 32e0bda..fe628b8 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -4,6 +4,6 @@ ^README-.*\.png$ ^\.travis\.yml$ ^CONDUCT\.md$ -^README\.Rmd$ ^README_figs ^README\.html$ +^cran-comments\.md$ diff --git a/DESCRIPTION b/DESCRIPTION index a7660a2..5151440 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -5,21 +5,20 @@ Version: 0.4.0 Maintainer: Bob Rudis Authors@R: c( person("Bob", "Rudis", email = "bob@rud.is", role = c("aut", "cre")), - person("Ben", "Bolder", role = c("aut", "ctb")), - person("Jan", "Schulz", role = c("aut", "ctb")), + person("Ben", "Bolker", comment="Encircling & additional splines", role = c("aut", "ctb")), + person("Ben", "Marwick", comment="General codebase cleanup", role = c("ctb")), + person("Jan", "Schulz", comment="Annotations", role = c("aut", "ctb")), person("Rosen", "Matev", role="ctb", comment="Original annotate_textp implementation on stackoverflow"), - person("Ingemar", role="dtc", comment="Pokémon javascript color palette"), person("ProPublica", role="dtc", comment="StateFace font") ) Description: A compendium of 'geoms', 'coords', 'stats', scales and fonts for 'ggplot2', including splines, 1d and 2d densities, univariate average shifted histograms, a new map coordinate system based on the 'PROJ.4'-library along with a cartogram 'geom' that mimics the original functionality of - 'geom_map', formatters for "bytes", a two-way bar 'geom' along with a - 'stepribbon' 'geom', increased 'plotly' compatibility and the 'StateFace' - open source font 'ProPublica'. Further new functionality includes lollipop charts, - dumbbell charts, the ability to "encircle" points and coordinate-system-based - text annotations. + 'geom_map', formatters for "bytes", a 'stepribbon' 'stat', increased 'plotly' + compatibility and the 'StateFace' open source font 'ProPublica'. Further new + functionality includes lollipop charts, dumbbell charts, the ability to "encircle" + points and coordinate-system-based text annotations. License: AGPL + file LICENSE LazyData: true URL: https://github.com/hrbrmstr/ggalt diff --git a/NAMESPACE b/NAMESPACE index ed0e61b..f60826e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -15,7 +15,6 @@ export(GeomDumbbell) export(GeomEncircle) export(GeomLollipop) export(GeomStateface) -export(GeomTwowayBar) export(GeomXSpline2) export(GeomXspline) export(Kb) @@ -36,7 +35,6 @@ export(geom_dumbbell) export(geom_encircle) export(geom_lollipop) export(geom_stateface) -export(geom_twoway_bar) export(geom_xspline) export(load_stateface) export(show_stateface) @@ -82,6 +80,7 @@ importFrom(gtable,gtable_col) importFrom(gtable,gtable_height) importFrom(gtable,gtable_row) importFrom(gtable,gtable_width) +importFrom(scales,comma) importFrom(scales,expand_range) importFrom(scales,rescale) importFrom(tibble,as_tibble) diff --git a/R/coord_proj.r b/R/coord_proj.r index 9bc3ea7..74875e3 100644 --- a/R/coord_proj.r +++ b/R/coord_proj.r @@ -18,6 +18,7 @@ #' \figure{coordproj01.png}{options: width=10cm} #' } #' +#' @note It is recommended that you use \code{geom_cartogram} with this coordinate system #' @param proj projection definition. If left \code{NULL} will default to #' a Robinson projection #' @param inverse if \code{TRUE} inverse projection is performed (from a @@ -41,14 +42,14 @@ #' @export #' @examples \dontrun{ #' # World in Winkel-Tripel -#' world <- map_data("world") -#' world <- world[world$region != "Antarctica",] -#' -#' gg <- ggplot() -#' gg <- gg + geom_cartogram(data=world, map=world, -#' aes(x=long, y=lat, map_id=region)) -#' gg <- gg + coord_proj("+proj=wintri") -#' gg +# world <- map_data("world") +# world <- world[world$region != "Antarctica",] +# +# gg <- ggplot() +# gg <- gg + geom_cartogram(data=world, map=world, +# aes(x=long, y=lat, map_id=region)) +# gg <- gg + coord_proj("+proj=wintri") +# gg #' #' # U.S.A. Albers-style #' usa <- world[world$region == "USA",] diff --git a/R/formatters.r b/R/formatters.r index 7a1f71b..d35edc0 100644 --- a/R/formatters.r +++ b/R/formatters.r @@ -18,6 +18,9 @@ #' @examples #' byte_format()(sample(3000000000, 10)) #' bytes(sample(3000000000, 10)) +#' Kb(sample(3000000000, 10)) +#' Mb(sample(3000000000, 10)) +#' Gb(sample(3000000000, 10)) byte_format <- function(symbol="auto", units="binary") { function(x) bytes(x, symbol, units) } @@ -58,25 +61,25 @@ bytes <- function(x, symbol="auto", units=c("binary", "si")) { } switch(symbol, - "b" =, "B" = paste(x, "bytes"), + "b" =, "B" = paste(x, "bytes"), - "Kb" =, "KB" = paste(round(x/(base^1), 1L), "Kb"), - "Mb" =, "MB" = paste(round(x/(base^2), 1L), "Mb"), - "Gb" =, "GB" = paste(round(x/(base^3), 1L), "Gb"), - "Tb" =, "TB" = paste(round(x/(base^4), 1L), "Tb"), - "Pb" =, "PB" = paste(round(x/(base^5), 1L), "Pb"), - "Eb" =, "EB" = paste(round(x/(base^6), 1L), "Eb"), - "Zb" =, "ZB" = paste(round(x/(base^7), 1L), "Zb"), - "Yb" =, "YB" = paste(round(x/(base^8), 1L), "Yb"), + "Kb" =, "KB" = paste(scales::comma(round(x/(base^1), 1L)), "Kb"), + "Mb" =, "MB" = paste(scales::comma(round(x/(base^2), 1L)), "Mb"), + "Gb" =, "GB" = paste(scales::comma(round(x/(base^3), 1L)), "Gb"), + "Tb" =, "TB" = paste(scales::comma(round(x/(base^4), 1L)), "Tb"), + "Pb" =, "PB" = paste(scales::comma(round(x/(base^5), 1L)), "Pb"), + "Eb" =, "EB" = paste(scales::comma(round(x/(base^6), 1L)), "Eb"), + "Zb" =, "ZB" = paste(scales::comma(round(x/(base^7), 1L)), "Zb"), + "Yb" =, "YB" = paste(scales::comma(round(x/(base^8), 1L)), "Yb"), - "KiB" = paste(round(x/(base^1), 1L), "KiB"), - "MiB" = paste(round(x/(base^2), 1L), "MiB"), - "GiB" = paste(round(x/(base^3), 1L), "GiB"), - "TiB" = paste(round(x/(base^4), 1L), "TiB"), - "PiB" = paste(round(x/(base^5), 1L), "PiB"), - "EiB" = paste(round(x/(base^6), 1L), "EiB"), - "ZiB" = paste(round(x/(base^7), 1L), "ZiB"), - "YiB" = paste(round(x/(base^8), 1L), "YiB") + "KiB" = paste(scales::comma(round(x/(base^1), 1L)), "KiB"), + "MiB" = paste(scales::comma(round(x/(base^2), 1L)), "MiB"), + "GiB" = paste(scales::comma(round(x/(base^3), 1L)), "GiB"), + "TiB" = paste(scales::comma(round(x/(base^4), 1L)), "TiB"), + "PiB" = paste(scales::comma(round(x/(base^5), 1L)), "PiB"), + "EiB" = paste(scales::comma(round(x/(base^6), 1L)), "EiB"), + "ZiB" = paste(scales::comma(round(x/(base^7), 1L)), "ZiB"), + "YiB" = paste(scales::comma(round(x/(base^8), 1L)), "YiB") ) } diff --git a/R/geom_dumbbell.R b/R/geom_dumbbell.R index 0522551..4996a0c 100644 --- a/R/geom_dumbbell.R +++ b/R/geom_dumbbell.R @@ -23,11 +23,17 @@ #' @inheritParams ggplot2::layer #' @export #' @examples -#' df <- data.frame(trt=LETTERS[1:5], -#' l=c(20, 40, 10, 30, 50), -#' r=c(70, 50, 30, 60, 80)) +#' library(ggplot2) #' -#' ggplot(df, aes(y=trt, x=l, xend=r)) + geom_dumbbell() +#' df <- data.frame(trt=LETTERS[1:5], l=c(20, 40, 10, 30, 50), r=c(70, 50, 30, 60, 80)) +#' +#' ggplot(df, aes(y=trt, x=l, xend=r)) + +#' geom_dumbbell(size=3, color="#e3e2e1", +#' colour_x = "#5b8124", colour_xend = "#bad744", +#' dot_guide=TRUE, dot_guide_size=0.25) + +#' labs(x=NULL, y=NULL, title="ggplot2 geom_dumbbell with dot guide") + +#' theme_minimal() + +#' theme(panel.grid.major.x=element_line(size=0.05)) geom_dumbbell <- function(mapping = NULL, data = NULL, ..., colour_x = NULL, size_x = NULL, colour_xend = NULL, size_xend = NULL, diff --git a/R/geom_table.r b/R/geom_table.r index 0c93fa2..a099e79 100644 --- a/R/geom_table.r +++ b/R/geom_table.r @@ -1,94 +1,96 @@ -# @rdname ggalt-ggproto -# @format NULL -# @usage NULL -# @export -GeomTable <- ggproto( - "GeomTable", - Geom, - required_aes = c("x", "y", "table"), - default_aes = aes( - widthx = 10, - widthy = 10, - rownames = NA - ), - draw_key = draw_key_blank, - - draw_panel = function(data, panel_scales, coord) { - if (nrow(data) != 1) { - stop( - sprintf( - "only one table per panel allowed, got %s (%s)", - nrow(data), - as.character(data) - ), - call. = FALSE - ) - } - wy = data$widthy / 2 - wx = data$widthx / 2 - - corners <- - data.frame(x = c(data$x - wx, data$x + wx), - y = c(data$y - wy, data$y + wy)) - d <- coord$transform(corners, panel_scales) - - # gross hack, but I've found no other way to get a table/matrix/dataframe to this point :-( - table = read.csv(text = data$table, header = TRUE) - if (!is.na(data$rownames)) { - rownames(table) <- - unlist(strsplit(data$rownames, "|", fixed = TRUE)) - } - - x_rng <- range(d$x, na.rm = TRUE) - y_rng <- range(d$y, na.rm = TRUE) - - vp <- - viewport( - x = mean(x_rng), - y = mean(y_rng), - width = diff(x_rng), - height = diff(y_rng), - just = c("center", "center") - ) - - grob <- - tableGrob(table, theme = ttheme_minimal()) - # add a line across the header - grob <- gtable_add_grob( - grob, - grobs = segmentsGrob(y1 = unit(0, "npc"), - gp = gpar(lwd = 2.0)), - t = 1, - b = 1, - l = 1, - r = ncol(d) + 1 - ) - editGrob(grob, vp = vp, name = paste(grob$name, facet_id())) - } -) - -facet_id <- local({ - i <- 1 - function() { - i <<- i + 1 - i - } -}) - -# Add a table to a ggplot2 plot +# #' @rdname ggalt-ggproto +# #' @format NULL +# #' @usage NULL +# #' @export +# GeomTable <- ggproto( +# "GeomTable", +# Geom, +# required_aes = c("x", "y", "table"), +# default_aes = aes( +# widthx = 10, +# widthy = 10, +# rownames = NA +# ), +# draw_key = draw_key_blank, +# +# draw_panel = function(data, panel_scales, coord) { +# if (nrow(data) != 1) { +# stop( +# sprintf( +# "only one table per panel allowed, got %s (%s)", +# nrow(data), +# as.character(data) +# ), +# call. = FALSE +# ) +# } +# wy = data$widthy / 2 +# wx = data$widthx / 2 +# +# corners <- +# data.frame(x = c(data$x - wx, data$x + wx), +# y = c(data$y - wy, data$y + wy)) +# d <- coord$transform(corners, panel_scales) +# +# # gross hack, but I've found no other way to get a table/matrix/dataframe to this point :-( +# table = utils::read.csv(text = data$table, header = TRUE) +# if (!is.na(data$rownames)) { +# rownames(table) <- +# unlist(strsplit(data$rownames, "|", fixed = TRUE)) +# } +# +# x_rng <- range(d$x, na.rm = TRUE) +# y_rng <- range(d$y, na.rm = TRUE) +# +# vp <- +# viewport( +# x = mean(x_rng), +# y = mean(y_rng), +# width = diff(x_rng), +# height = diff(y_rng), +# just = c("center", "center") +# ) +# +# grob <- +# tableGrob(table, theme = ttheme_minimal()) +# # add a line across the header +# grob <- gtable_add_grob( +# grob, +# grobs = segmentsGrob(y1 = unit(0, "npc"), +# gp = gpar(lwd = 2.0)), +# t = 1, +# b = 1, +# l = 1, +# r = ncol(d) + 1 +# ) +# editGrob(grob, vp = vp, name = paste(grob$name, facet_id())) +# } +# ) +# +# facet_id <- local({ +# i <- 1 +# function() { +# i <<- i + 1 +# i +# } +# }) +# +# #' Add a table to a ggplot2 plot +# #' +# #' @export +# #' @author Jan Schulz +# geom_table <- function(mapping = NULL, data = NULL, stat = "identity", +# position = "identity", na.rm = FALSE, +# show.legend = NA, inherit.aes = TRUE, ...) { +# layer( +# geom = GeomTable, +# mapping = mapping, +# data = data, +# stat = stat, +# position = position, +# show.legend = show.legend, +# inherit.aes = inherit.aes, +# params = list(na.rm = na.rm, ...) +# ) +# } # -# @author Jan Schulz -geom_table <- function(mapping = NULL, data = NULL, stat = "identity", - position = "identity", na.rm = FALSE, - show.legend = NA, inherit.aes = TRUE, ...) { - layer( - geom = GeomTable, - mapping = mapping, - data = data, - stat = stat, - position = position, - show.legend = show.legend, - inherit.aes = inherit.aes, - params = list(na.rm = na.rm, ...) - ) - } diff --git a/R/geom_twoway_bar.r b/R/geom_twoway_bar.r index b986f06..575ff70 100644 --- a/R/geom_twoway_bar.r +++ b/R/geom_twoway_bar.r @@ -1,76 +1,77 @@ -#' Two-way bar chart -#' -#' @inheritParams ggplot2::geom_bar -#' @export -geom_twoway_bar <- function(mapping = NULL, data = NULL, - stat = "identity", - width = NULL, - ..., - na.rm = FALSE, - show.legend = NA, - inherit.aes = TRUE) { - - layer( - data = data, - mapping = mapping, - stat = stat, - geom = GeomTwowayBar, - position = "stack", - show.legend = show.legend, - inherit.aes = inherit.aes, - params = list( - width = width, - na.rm = na.rm, - ... - ) - ) -} - -#' @rdname ggalt-ggproto -#' @format NULL -#' @usage NULL -#' @export -GeomTwowayBar <- ggproto("GeomTwowayBar", GeomRect, - required_aes = c("x", "y"), - - do_setup_data = function(data, params) { - data$width <- data$width %||% - params$width %||% (resolution(data$x, FALSE) * 0.9) - - d_plus <- subset(data, y>=0, drop=FALSE) - d_minus <- subset(data, y<0, drop=FALSE) - - d_plus <- transform(d_plus, - ymin = pmin(y, 0), ymax = pmax(y, 0), - xmin = x - width / 2, xmax = x + width / 2, width = NULL, - is_plus = TRUE - ) - - d_minus <- transform(d_minus, - ymin = pmin(y, 0), ymax = pmax(y, 0), - xmin = x - width / 2, xmax = x + width / 2, width = NULL, - y = abs(y), - is_plus = FALSE - ) - - cat("setup_data() after _________\n") - print(rbind(d_plus, d_minus)) - - rbind(d_plus, d_minus) - - }, - - draw_panel = function(self, data, panel_scales, coord, width=NULL) { - - cat("draw_panel() _________\n") - print(data) +# #' Two-way bar chart +# #' +# #' @inheritParams ggplot2::geom_bar +# #' @export +# geom_twoway_bar <- function(mapping = NULL, data = NULL, +# stat = "identity", +# width = NULL, +# ..., +# na.rm = FALSE, +# show.legend = NA, +# inherit.aes = TRUE) { +# +# layer( +# data = data, +# mapping = mapping, +# stat = stat, +# geom = GeomTwowayBar, +# position = "stack", +# show.legend = show.legend, +# inherit.aes = inherit.aes, +# params = list( +# width = width, +# na.rm = na.rm, +# ... +# ) +# ) +# } +# +# #' @rdname ggalt-ggproto +# #' @format NULL +# #' @usage NULL +# #' @export +# GeomTwowayBar <- ggproto("GeomTwowayBar", GeomRect, +# required_aes = c("x", "y"), +# +# do_setup_data = function(data, params) { +# data$width <- data$width %||% +# params$width %||% (resolution(data$x, FALSE) * 0.9) +# +# d_plus <- subset(data, y>=0, drop=FALSE) +# d_minus <- subset(data, y<0, drop=FALSE) +# +# d_plus <- transform(d_plus, +# ymin = pmin(y, 0), ymax = pmax(y, 0), +# xmin = x - width / 2, xmax = x + width / 2, width = NULL, +# is_plus = TRUE +# ) +# +# d_minus <- transform(d_minus, +# ymin = pmin(y, 0), ymax = pmax(y, 0), +# xmin = x - width / 2, xmax = x + width / 2, width = NULL, +# y = abs(y), +# is_plus = FALSE +# ) +# +# cat("setup_data() after _________\n") +# print(rbind(d_plus, d_minus)) +# +# rbind(d_plus, d_minus) +# +# }, +# +# draw_panel = function(self, data, panel_scales, coord, width=NULL) { +# +# cat("draw_panel() _________\n") +# print(data) +# # +# # d_plus <- subset(data, is_plus) +# # d_minus <- subset(data, !is_plus) +# # d_minus$y <- -d_minus$y +# +# gList( +# ggplot2::ggproto_parent(GeomBar, self)$draw_panel(data, panel_scales, coord) +# ) +# } +# ) # -# d_plus <- subset(data, is_plus) -# d_minus <- subset(data, !is_plus) -# d_minus$y <- -d_minus$y - - gList( - ggplot2::ggproto_parent(GeomBar, self)$draw_panel(data, panel_scales, coord) - ) - } -) diff --git a/R/ggalt-package.r b/R/ggalt-package.r index 3ad2f78..2d3abba 100644 --- a/R/ggalt-package.r +++ b/R/ggalt-package.r @@ -8,7 +8,7 @@ #' @author Bob Rudis (@@hrbrmstr) #' @import maps ggplot2 graphics grDevices KernSmooth proj4 ash MASS #' @importFrom dplyr filter -#' @importFrom scales rescale expand_range +#' @importFrom scales rescale expand_range comma #' @importFrom grid grobName grobTree unit.c grobHeight grobWidth viewport #' grid.draw grobX grobY gTree gList textGrob gpar pointsGrob #' segmentsGrob polygonGrob diff --git a/R/zzz.r b/R/zzz.r index ee7eda7..9bcdb4a 100644 --- a/R/zzz.r +++ b/R/zzz.r @@ -2,8 +2,8 @@ if (!interactive()) return() - packageStartupMessage(paste0("ggalt is under *active* development. ", - "See https://github.com/hrbrmstr/ggalt for changes")) + # packageStartupMessage(paste0("ggalt is under *active* development. ", + # "See https://github.com/hrbrmstr/ggalt for changes")) } diff --git a/README.Rmd b/README.Rmd index ceb3f9a..8756d66 100644 --- a/README.Rmd +++ b/README.Rmd @@ -23,12 +23,12 @@ The following functions are implemented: - `geom_xspline` : Connect control points/observations with an X-spline - `stat_xspline` : Connect control points/observations with an X-spline - `geom_bkde` : Display a smooth density estimate (uses `KernSmooth::bkde`) --- `geom_stateface`: Use ProPublica's StateFace font in ggplot2 plots- `stat_bkde` : Display a smooth density estimate (uses `KernSmooth::bkde`) +- `geom_stateface`: Use ProPublica's StateFace font in ggplot2 plots- `stat_bkde` : Display a smooth density estimate (uses `KernSmooth::bkde`) - `geom_bkde2d` : Contours from a 2d density estimate. (uses `KernSmooth::bkde2D`) - `stat_bkde2d` : Contours from a 2d density estimate. (uses `KernSmooth::bkde2D`) - `stat_ash` : Compute and display a univariate averaged shifted histogram (polynomial kernel) (uses `ash::ash1`/`ash::bin1`) --- `geom_encircle`: Automatically enclose points in a polygon - `byte_format`: + helpers. e.g. turn `10000` into `10 Kb` +- `geom_encircle`: Automatically enclose points in a polygon +- `byte_format`: + helpers. e.g. turn `10000` into `10 Kb` - `geom_lollipop()`: Dead easy lollipops (horizontal or vertical) - `geom_dumbbell()` : Dead easy dumbbell plots - `geom_stepribbon()` : Step ribbons @@ -310,10 +310,10 @@ library(scales) library(ggplot2) library(ggalt) # devtools::install_github("hrbrmstr/ggalt") -health <- read.csv("https://gist.githubusercontent.com/hrbrmstr/0d206070cea01bcb0118/raw/0ea32190a8b2f54b5a9770cb6582007132571c98/zhealth.csv", stringsAsFactors=FALSE, +health <- read.csv("https://rud.is/dl/zhealth.csv", stringsAsFactors=FALSE, header=FALSE, col.names=c("pct", "area_id")) -areas <- read.csv("https://gist.githubusercontent.com/hrbrmstr/0d206070cea01bcb0118/raw/0ea32190a8b2f54b5a9770cb6582007132571c98/zarea_trans.csv", stringsAsFactors=FALSE, header=TRUE) +areas <- read.csv("https://rud.is/dl/zarea_trans.csv", stringsAsFactors=FALSE, header=TRUE) health %>% mutate(area_id=trunc(area_id)) %>% diff --git a/README.md b/README.md index b5dd903..2959ade 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,13 @@ The following functions are implemented: - `coord_proj` : Like `coord_map`, only better (prbly shld use this with `geom_cartogram` as `geom_map`'s new defaults are ugh) - `geom_xspline` : Connect control points/observations with an X-spline - `stat_xspline` : Connect control points/observations with an X-spline -- `geom_bkde` : Display a smooth density estimate (uses `KernSmooth::bkde`) -- `geom_stateface`: Use ProPublica's StateFace font in ggplot2 plots- `stat_bkde` : Display a smooth density estimate (uses `KernSmooth::bkde`) +- `geom_bkde` : Display a smooth density estimate (uses `KernSmooth::bkde`) +- `geom_stateface`: Use ProPublica's StateFace font in ggplot2 plots- `stat_bkde` : Display a smooth density estimate (uses `KernSmooth::bkde`) - `geom_bkde2d` : Contours from a 2d density estimate. (uses `KernSmooth::bkde2D`) - `stat_bkde2d` : Contours from a 2d density estimate. (uses `KernSmooth::bkde2D`) -- `stat_ash` : Compute and display a univariate averaged shifted histogram (polynomial kernel) (uses `ash::ash1`/`ash::bin1`) -- `geom_encircle`: Automatically enclose points in a polygon `byte_format`: + helpers. e.g. turn `10000` into `10 Kb` +- `stat_ash` : Compute and display a univariate averaged shifted histogram (polynomial kernel) (uses `ash::ash1`/`ash::bin1`) +- `geom_encircle`: Automatically enclose points in a polygon +- `byte_format`: + helpers. e.g. turn `10000` into `10 Kb` - `geom_lollipop()`: Dead easy lollipops (horizontal or vertical) - `geom_dumbbell()` : Dead easy dumbbell plots - `geom_stepribbon()` : Step ribbons @@ -435,10 +438,10 @@ library(scales) library(ggplot2) library(ggalt) # devtools::install_github("hrbrmstr/ggalt") -health <- read.csv("https://gist.githubusercontent.com/hrbrmstr/0d206070cea01bcb0118/raw/0ea32190a8b2f54b5a9770cb6582007132571c98/zhealth.csv", stringsAsFactors=FALSE, +health <- read.csv("https://rud.is/dl/zhealth.csv", stringsAsFactors=FALSE, header=FALSE, col.names=c("pct", "area_id")) -areas <- read.csv("https://gist.githubusercontent.com/hrbrmstr/0d206070cea01bcb0118/raw/0ea32190a8b2f54b5a9770cb6582007132571c98/zarea_trans.csv", stringsAsFactors=FALSE, header=TRUE) +areas <- read.csv("https://rud.is/dl/zarea_trans.csv", stringsAsFactors=FALSE, header=TRUE) health %>% mutate(area_id=trunc(area_id)) %>% diff --git a/README_figs/README-dumbbell2-1.png b/README_figs/README-dumbbell2-1.png index b43f87205e930fc1a1470033a1679a3ab005e0ac..151f6110eb73b63fdf9cbae1bc874f3360c269d0 100644 GIT binary patch literal 36078 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 I_15423owSB761SM literal 36136 zcmeFZWmuH$+BOV`0f;ClAgu^UOLr*UNH-!~gT&A&7A>G4jnXX*Gn7H6bPXXrlynU7 zo&);a>t5@Aet+M)y~`hL(9>xMa8(7#R3+vXW{T7#GDcFfgaC zTmtWyX*M@uU|{20OGv27Nl4JBIyqQa+nHlv@P~zI8d_0k-V}v9ThiX^Qn%xN>5?sm zPlq3^#r?4i=7&J=LSp22NAE70?XGowXzk+Xf**fWky7>MKqlP$USH`?bAN|mOtg&s zJucm7Kh1s7vi(5S#gNS9I3cb$YgqAw`I`4u(t5JjTD9f+#l`AeotVg*n8fjgtR$R2 zonJ@15n+D&;&m#?rH|T=DVYs(6tQ?!@Z8GvCndgm8IKGgPEragr73UGI8r|?ozKR5 z6M^|FOS9b-)AKNrS`4X2wfl6jl0*DEyJyw3>CiW4QQt6Yi&>VReQz#ms@uGYy&log zxG#Mb#qoL2I917JId^gH)6)bfBDMJ0y2(k3{THj3TlU|wy5mwrU#y!LpqP2+7N#G6 zSICV@kv_We)7IXnf?{ecCL!{M*rm7Q6Y)ivH`XN$^2aXc)}^Euln3AOU3kH}#qyK& zO*h{{oBEgGyxi!<#4oPjD|z%bH-)epf?)db8_iBAd-deag*hZoe7l#2{hr+!q-o&K)ieypq6?nSsLQxU!;2}?{R3D$|!3!a{1tKV;6~ciuX(2ya2yC{8F5Y z_dh&%U5l%vbK!>Beep|^#KTrOf!8i^-YmFzJJ|T61qt~=gYc$cSzPCry07m}T3U<) z530J#n9N>_J|`|AI||Py?la%Wdud=wB<9P)hb2aTn}%>Cu-k}JZa31A6Z5V|u&~l@ zG(`!K+4|wIyq%PhFyG*DO(>UIW`Yz#pbVb+@Up_|N0Tv z7}Q9)<+w4cO(5+X(;Bx>v~4J?>%ewRIzRT}q0NETZRIe@{O!Q)*JUiV3_kadn`%3K z+I%{Fx_rJEVnqtIC(YDNvpu7BHg4Lr*&@@M^dj~kt+ZTyOXvx?Y%1Bvnys7@ZmEHP7PIuqq{-yEn z&iM#FvKzBBp+(HW3C`BC*GVp-rra^ znyv~=bK@6p3!n*3eZu~x_MSA$51mhvO52t+2aKOMVm?TQk%iGU4b$ur-jYfyCQ<$V z{O0ua@Cl)zs)|#OrqeYC2L}sCyD+@8G-bMce2t51(j$3~OUMgVYiWV?(3FrK`?@#= z=70Wac#S0>YDc8>=$}3W?%;`{=<;KU1j}C2>$Vw{{9XZW&IB;Y^_QEb3EuVzQr)7{>O=8U{2z`#n`bQ z>V5E^tAL(74Q89@Kg|-nS9gmB6FF9xVe%hKaP|Xntam>D%kp_Mi(~ay8Y+DI=XLPM zzK{CnwY##f<&T~10FQZf=bs0Kqq_UgYj^!u0S1ohq$?}F#6J%TZ0Lo5p2&YU^xWwF zyP@I@|Mk!_@A{07xF0A@Gm|0T7xnz$FPjR_uk9E(fL)nZnq0_6-y)pRK=1OUI zTc3&;YkLf9pIUudgy^V~@ybw9O3Z5Y?RTc33Gq2$8Mc!aDYEurB|PUy;^_X{g=Xm= z^w>ur>or^9EV?CHywR;o#ukgv~Gcq!IVNhE!?r2`LMd{K#TS#(i zgAN%oK%r0zxU;kK++O`@?LiCE6|!X^%w79QC?ozkE^E+6SR+Il104i_#k}jBi+Pf_?)yBn1`w6Oz>mv zf+g;vxfYgyKX|H&7Ch)v`mf-w)m+kDkYK}c5=Af zss0o0x=NI^zK}Lje&Bd&|wMwy+Vv6G??*DPP}i#)dPgqYx;IGNxMb%5)<8j2F>G2NlDE! z?i%|YmwUi``tILFDu12yJFUG+&dcISTyz7y8N&BcPqH(p6tC&g+&)87fAk#u7d`Zwq?Z`BJr>J5i1^ zO+3sIEYE~aNQ}MjXtnac?-!c#zi^NAYTL?4X{S2IfVDqz=L3gnNAttWl(X*NQd>M3 zwrVOWv_$u(E^KwJw#Tx^hLQ8h`})?otWOxeBA|vON4ZZ0ToyF)a^CpaIQ`>;YmlO* z4D|ILn<4DO0KziG$85GGa^9K8rZhjl!<*`O(mE@N*wCzwisR`E^J=Ct&Pqf6SGOVS zBw7g?Zl8_ItRg!S_*DAmF#2g37-V+G9K`zMj>o;$Yw6h8Prkh;_o2w$iZ%9Sob=f< zTr}UeJUuy{`~2-1mvNCHTuby|mgoQkC&}8&xOjNx;5+XX*s9Yrrd)Ptpf5 zv9SrU{Hmx|HtR2Nh|*;usHW}H4_lD~d7XP%f`i!!e%ot^v6`Sp$7V`~3zx3GfeW4< zulsfGX>SLk0~H8+A~2nPl;dE&ZfBe3m&Y=cbUugMINj~veGj(#R60#3o2mWm!cVSI zqME`fnIYpX9i97vlPS~6iqk~Ug1OsV7CMlP^l0TMcf zx?-*S+M9H2@I6RqT2^E)9(`79X6%Z z&!#;o^4(!>hb6jAczl7uV5x`JL&>hIqZh*@3r&+ww^B}r3mpu&`Wy{;`efs=FXNM$ zk<)7M(T)&uN9k2;tW_^06Pvzx`qJ0P4FR2Ym;T!8dJHy)y~bdcC=2R)ikg&Ri|==) zL`k{4obOJd=8j6JxO9h$_6DUvwUhZaGQ0?ZoavFKSBf{&Rhe-SbG|V%YWZ;HFfXQ^ zl-4cK@31fB(Z}aaI|hNx6waY@CApo_n_N~$CNwqPOey1jr^gRzG3|BvXg`v3M;%l& zlWFb&cPQ3{4xsM$$3}{wc2~#jbTv~azD2f6iSk8hD-CYw)elpmG{{}o#&6gB3}&_) z8-ziZr}B#GM$>(Mu)8!zj3+0ocT0wk1mzRy`sFPkYhx1ngBKc&-ARqe6U9axWC57HTXw_+KR`$SDH zd8pB9UK2ZdrdtU~vge6qGh{;2<2uyt#H@0_^P^sE0U{aQ3|g_4J` z**fmmR~+GkvB?vQ@MO)Qb~|e|TFC*c4{=gFWE-j&DqcfMW8 z>{+}6KPZmLdRni_r=UtZnJ=v=J)|C%sX<%#N#>~(JBepfo2XV=CcR3sUHGO(T6jMF zOxnZH@0G$wzrM}Os+9ZX{YY_*4$hIbZyq&*^KZP%69lfISy;0vKW5vjrLCPn`;E%) zXv6(cmbotbZV0Sz?*f7FljX+%M~EG?s+f(ISy#04cRu5)>)OjwCwJ*qA5znzEhwPp z`N{67Mhi=0;1R4YE-scUKD1MBcFvPalAFqqqs;0O*)ymH>DWH6+-87j%PnHa*bm_v z=Wdz)lQg=`)UReW0(zj~ebS^yf@sfpnxbm|Yk5P_?eseJd3u|~A+7g*;Gxm5|I=KE zuzmQ3y$nRMyObO=m#ePte#YYANUc`dd?@x?^Ywdzy;C56M~twR80E6r+*93t7k=Ze z^wZ%Ad`Ku+f3@+8qfq$BSjC-Qk;7`TIIDYU5+*EuFhujmu;DQ7(89F7%@o#PQK`o~`1^4E5=i+R){! z+>i~0GLO}PDy{y{pJ82z1L=j4OHGth&~*}|V4MwkkfKfh0Bhy=Q+VzWO2-hcZHVF> zlndilA9C&&Vbq?vDTzqfu=6h32@#wi^?UYXe(t960!m#!@aI)KzPntW+%U3>IaFHF zFbj*>o3#+DWJJZIt=f}5etVs9(u=t$(wQAozx?BT)E3{MXZlkC1nPy21TRIm+7E5J z3+G#14@k2eE0x^7rBK^10)xs3Zz;re8N_Yj2|2eT9i*v2V4vc!z<@Dg>U$Nj7R$7r zfppSDUfsUF5;9W=8G?L!MYR+nR@LC0ogg!;ge)8EaYDW# z4N^wN9t;_Ibvi+zed%3ELi$}HMAT!-LY&!pSe*mJ6Di?@ainbf1}- z%i+7poX62d^XphVkspX=%-tMYB@fzpqN(}5+8TO+Yv%A>c z4H_j;k%=sY7Hu8hUgyv+7m9>_s?9edA8NRoORoHKA|g^OOi1^&wxi%gZg*JAQflC} zl2FUgLDg-nxV;|MRAEpmE=ohLVpVlEhAxaf%I|C z;{a(jI)lMpBCzlkMaUxQqF0%sK8G!!nxXa_S;->L!Vp5ZOWF%<&ObzEsy9&%Ck#m3 zA`PP9SPQigP;vVx*r;OIGHF95?EaZF2$HAk_?BwFn&_q%Mq@{2*XL4a0=^##!k}CyGRor-K3|5LUo!VkIb2J2t{&) zy!V!e*kQxolsHZRtNFSTlwiBeTu&9V+<`U)8 z(1y~hd4-dUE`kMf^29G;dm-!frxQ=}p3-j@5E6yi_wt|G$Y>G*ivK2L7P$J{()fJM74^u}xjY5-JAPYy(%33g5*-Dl*bh_3uB_YFGw zrkO3!B>R>OPW7+xsXZ5BV{&kFvzhfEQY42b3rE>tKYo?<6BSWT<-T%PMY+Em#)-#7wDEY?Z!uj zW71lT9^bWFuuj}$m}v?NdGpIpW%cRtB;lGE9FQE1Rm-2vr<}V*w8Mqg_}e`;Ze{{_ zGQ?jRpHIkVQw_>cJ>SRLTm8N_1V(lgV28tu8y}B%>B1)9~4N8mjpIbvFTZ}0gVCwkjskaHe#s59^k60eJ^&E_~ z#~?TTZOX`4->swz`F`375k3~+e04|&vmIg^lhm0l(drIcmJde6^3BA1Yvp|~NA`Q? zwN@ErYZg~R5<&&b$<>*5@!;gE*>#l)yV<;Y1D#c_c2y%rE2i)p z->2neM2gA36cCrncSsc^|5C_e|HOp3TG<+M{At%Q&w6>Vz+y5_f#4ojBbo6KiYpGb ztT)6aaGMO1OdcX=FUF14&yJ(I^I8mU-JLArTB^q~d=H>^s18vpbI@fA?D~17_gzPA4qg=6*Y@sg<2^c|i z=-6OB(`&$Q)^eSZjSaHfT&#-4{cb!oKl3n6XST%|>Onjp<}2qfT`|zPAQ-{nE3mtK zas(|EL%hjwPEp-yub7D=_jz>nJjInf1bm0caJwt*w1(!Y^yc@ztB8%69EI5uWP3Kk z%uNmhK1bUgCKMoDXSX@t+6PINmzOm5E0I%;HOl5qacsI>F=PY>m~;+M87|hgT|?w$ zrEe@}m`p}`88bG%ha6$O&+(y9@q)7E5%Rl6_j&a~DBEU8o*kM7lTF90+*Cljso8Ro zsSmVs_D7lwA6@}rV%t$Wd%Yc}iecIzsE#3OnMT>_a|MK{NWChpjf9IW&#{u4N$V+4 zwTE7Dg$VTp(T~VP`(`e~V@ZSaX&uo6o+wacw5R8ZJ~JGCajftOhlHDVh*FcrtP4?! z8KI?e7J-n5V5f8NZFN&qokf6kV~grfMx9#wl!ZEXgdCSA*rNnq_Tt_tA-J0&!@k@f zp}dv&RN8?y+IV?wPq9Ky6Ok0|qm@=aQ=rYV0j(38DR9V*sT9OF@)=Z25jC{2wN22F zFiaao3J%z$TUqs6&Ef*2qqJ5+CBQzGye!8X#6Xn`U%5 zkH5gqv!GcBh|L7MWqsusY4z{u)O-*dL^;uV%}XR&SvM3}?b&}U#|sQJGg>I@1ewRL02_( zi*&{%(N(Zc2rOSt9z1bk0dh2vl{XR8G*GQ_Pmf{nPm}T#?-@QAeleocO+#})i6bh> zrCFuS7bLyUhUJ#s$rW3A@f=SYFvg@R>_(mnb$1Dhi5VwewZG8BZ@RlO!fD-muRUWx zmhC;M{bXJ3+>se>(x{o`jqcsVLep$QJkzGoAcjPWXAPLsb6f=x-)`+S5M}MfAUeMZ ztJ)iDepw=GM!?-vUisMPV5NEz_roJ{&H@Ut)4QybB^}p^GMSUWLAsva5ciVen1_@V6doy}Y+UtdnSN6}DbsUM*HSlGIp^nU{ppEQ zJ8R`VLcvU^TCwp}D&gT0Hs#|d=wD}UJ8G1RZ1h^EhxXx1|IDdDAZAwyoj1Pkek(x| zP;04ILJ;}EGi)I|b%lGDx|+&mE0AU@_|XIGI9r?_pHSY8Bx8ASuv;r)JoJhn0B_z3=E!;9fOXCeK9h$^W97Wd}74AO~`RSC6H zs-kAeT6R;+$(JRCHL^Wxrh3g(5f*U_*?!0*>R0PRF<7gTeJl)Sz2xp!s`R^Jkplt) z886$Gw|8QA^lLrK|1F?|ZLH(m~RfSZ`Uf;E|MbK8${7n9>#Xb&xtDi;A( z(Oy75=_jh;0s(h|+mNAK5CRd4ruXbTG<$N?8QPsRs{rLN=3&#s)h$fBH|`v<%IP-l z_!@A>9j_Xg=P~_ERX&G9uO15$4@SGmfdLrv8yg+%Lpy^DzKMR;=6A& zlC;P3*v{_HM8xvikG23-n7$r`Shpie)xrUhGD$~8?AWDxwPI{GJ1v}$2RSWvdJu86 zetJ^0%0y!561iHVW10QqJ%QNK=WI#+?evO*s3OZ`kIer5{uTgj>HH4bjX#la8RxzD zez1_@AmC6`yIaDd{jwfVw^E3mGKtsM<~eDlL$9z4`JH&j@jE`Rk|5IYR{%$lIR%)YSPiF@K0lJ9p^>~D#Wlv0$$hv zXbuI&V)Q8;R-~zNXtWKX?*;UfcMcd*yzibKEr`v5JY5!+(#q9ethhP@>fu;G0<;6d z4N@^#sD!Mg_zQ=(nbSICT9g|?!+I89WRcxKx{O?_BuWkPtl1;C z--+ice?EXJC=Xt$?%tgf3;6G380x=a{=PL3tLaT;s$;Nf&v0avFNN1iai?Ck5Sru7 zOJ6P+g(S)k=da~9$i|O0`TY!HU>V|&CLJv#$}4re?Akt@+aqh%baPS`gD=RjgQNL- znNdEJJ4#*YXYQQ=r}f%BdW4awWWIT+%kDwo>JTbwPdI6N{By9lTlVdxFm>C6 zGR@i^N;E8uGF7`|WPeps)p8v+{1dHVtxP;c~pHf(x zsBg0_Ti^ToXux_?-N$vbc1W`}I&NI}k`AS5VtA#ieJ~p!S*ar8KpoA8qB-QxAHBU^ zw`$>&zl)>EVA#xcD*@+sIOJ3TK|XBKzm`A8R>a7$@z!W=rcj;!Ep5LqZnm)9QQL2{ z4~T+t3YT3cJQhX@bJqy-*MvuVZ;Ckmu+gwl;7FV&4`Rt03Eu)iofL<{`9+qgl->uA znJ~WKNEf?`cWa`MiiasTvwgI~qpZfq78-I$DWJp)O3Cde39 zvf|qw$K9%7`E8H3K;J{kN2^Kza0WjuD5JtMP^4+7;gn#}p5ue%@|n+|UR^B(`B!1L zw(aoT4)%3HkbCW=ef+axy$)rQ_i=5%Rm;H8wlA!2QesE7wH5T&6#L7wekS!(>J7k< zWp;2mM7C@aa-w(kW?BYRox>RH^x9jyP;Nr=_{DU>RIMSiK16fSARo~n8q1pcI%F%b zWU~YElyCf5;P?1M0z;;|$@@megQVv7k)$`;(;>dwVy9bT#Vlk-O$BG|k~YtkAaxMH z4^uwcDU4zYxX&$cooqC1PCiEw{PI|42SPvB@ z8Gd-tHn1a8e~4tZUV=G9eo+Cv!8ksLWPTsHYpg}mtI|f3TpCmdeakpK8Y?8G&EY&n zOCDb?l1TQJ?bm?F|1=Rvub!z`Y^dc%JqF?bW=R2>a+{z{{07z<(w8n>S$leda%A{C z;E5cq|3RCYR+$l%m*RV9?c&%}FS^|$A%#en4ZH3Vf9WdelZr{UFBX-B3FysUMW%E) z!A;@v-^Y$`^fGbejy@q_9@#yZE|uEjkly~Cp%>cbcj^z zhVL;F1)MWUhpLJ4@P_jqKSN$a+DIlEe(K8!g3ajL>mwvvs_aL5DZ)v9S_VjMNE z8mVNS8 zX~CV>6nAa5)pHqUq-p1^zB|+%G%3PDDFk|5%H>0w)GJx_D?Yg4YPof3xy5SZ;PS-F z?&xMJK~_mv%g3q&-j0xjkg)TrG;0NMmaA;9Pu6E>QZ6hbO`F4P;&V=h9nm>r)(T0oR9ZB4yt~>y4?Wr(`Lsn!G%DsoiBccA3cOw(X)q`*N2hHIJ3z<__EE@pw|lLs=@+&C3kPaB59T zBa1f}D5+O2HwVsmk6-UGQtIoF%4C7Rd#+T3Q)H=B$k4@HZeHFt0Jm7p&CP$5KJ_es zgr~1%`hu(Ku@!NN4q=qv>wfbn2_+?s;a(GkN6hl}B_0XAp#qe|4NA*%E?joF0#+c* zH}!WNLNld;DedoBWel_d2QQ*ia&?(-tYeQfwxG@0V^7+IF?aDC_TpgaFZ;|{YYe?? zUZcnKgrQ-fDCz3l??v<%-^4Pw!0jPne*+zT8ChAC?w_Ew1!$}~0|Wa2NsLQI?}Oct zD#zJ+QR9J8%yeZ~|Jesuun*SjSSZ}=zR87-I9hFEpYk$?$qC;tZv+4^d#`Qe(O6@m zW@2LUJ#k(I+U!s#CC~ZL|M)JEXOQ3-IR>;7-NyAh_g5eOCXd*0Kpo7!^Gd>yiHXS! zR2!QosPzQ7A3MuK3ikE|S4kg;UjhvZ(f*cz(k?*-Cue8MySm*@LMI}7KnGA|$5;EvbpG?zQ!j$Cv0`wL|MSo|wZX;b zcPV*f{`u;}K!jfL---YGru|>C<2B5mJ$G!@wZh}khE9w{QOTluA84dh@UR0P>cU+M zvX*7%z}y0?0(fi(B}p~}+tIdoa7}#cMvGYh5{XnS6otxQ1hCwks(Sx2NjdsP%d>!{ zCh6(n_tQzTJ2zS$1?1-Dve@w`xe|iI0qNg_|8AXsjIPBBSmAAij|SDBcmD1|iNMSR zmmU!O^QWA8z(}RtsNesykzz7{iz^Fu{K+eSA3{JVF>sI{2${Kmc8~@%0T6v{>)*Hd ze1J4*=ml}vd+hP|tNt12v;Qxr9Uz<)_xD*l;A&{CN4;!cXvqyzFxQ^r#UVW%Enm8K z>>1Pcxwc96@p8pPK7aXdIi*yoz~528=jk|wAWAi$U+-4 z&$kbo%*-*&u*KG*A}aofF|j#y#pwjvc~xT9D}`-(|lR9lRe03AL(nDp6yV8;*DX=QbmiRBjcQWLvrW$dCR;lL$;^)^4w||O;HnU z7dON&_VaMNXXE6 zW-v=^c!emPJvJw4et#5dHyhJdGorA!|kOK_l>8` zt4hhjx-i#OWYtx!8{#y)0YHQcl5Uv2Nep^dglQTa+b<-&4bU7eF-4j71WM^SM1{|Wh5aQX)aT392D5?wac8^?63 zrA`F4+?)oM_GFVC!&K?9pWafioab)*5!&(&v7DT-%$ zy}py`sHA$*l9o4FLl}#l{VKU?rKElKgK2niXvd<80x|AicVxj%_F53tt*{7aO#B|K zWoK}2-Dj(Yg72{AJJx67^R2cf99G?X-rvfrU0Ij0si0eZ3|*RB($JnE?C=6jM4oLq zAXiNXoH*HCBEmoZC{Ck~?Wzrljh*xx-kGo48sKu;e?zTclE+)vOiy!uVL@!<^D%S% zZ(f3r+J7oV$k&H6I9s~2!X|Lql-}0#k@RE#&($yjJ~wzd8%K#i2d0N0A~`t)?}}oO z2ZT#nltJeRPdvS$;xHmieUkich=G@pW~DN(ruVd-FqVfph%5hsG0?73-C&6~F-ZTQ z{z%=v7zb<{up<94EI4_+tB_f=JGrZ0?<^1d5d&b${e0v@{t8K)2I7ck7OhM^#=BZ} z`)uD{W{aYKD_(I0J1|UbK&P<0dMuB`I!xu)HoAd;@AC`rt}UP!7B3~bRyC9EFj?2x zMvDgmx)~5uSUd*Z`g@>pfLvZS-LYps*s4t%^tr9&EK0a*rW(1DWz`Q^7Z_=-3KneOB>RGZO?LPMG%P+*{pkB_@=Z_CpH06) z(RV9h@E`3TR-Um)gKhjri!SE3jL|*RLgiGG(yP*z`m+YpY&w=J3-!aVRd) z85(N94``aA;`_?ql&AehXhIj#J8_GoFr!Uh!?QX)~|w zD$w|(13Cb`l>Jwd8$(DEq?kY3Z!KV>n5X@J_l;iMatGLv$rVMB~d^t7$5t%FNw|7d3b%o()e3C&*jVyeNU*~+%%m+xik5Tz%-hd_M43(>v$R_P~{U9_sz)@WY^ z{POhh9r0hM0{6wA90gd)L&8yeES>G0u@_!ZEMK@2j~)@tTUIPeX9B)>vYy^?t)?9@ zFJkIUI^Ku1XlcBV&qJlZ{OtM_JeSpBg>bROEVRE1*ria*frtxvNqg-)c8p%sTiAYg zt-8~JceUx20{leL$!QaDMd~U6UezgsIRPK9re=bu53J(@$2TYEXa<#->2I&~yV9=z zOGuFoz*A1XYwW$3Y&TKITf#rRU^u!LL)2{W?$=@do3o%G4#W1GPhy6X&C8`}z_nif ze2&SPy(LiCNc+|eY_H8?0uX5jd+I1@YHDgVzWZw#XnGV=tFi;f`8OO7R%^v#M9N!_ zsYV3rW!Z!dRMduZl}cAt&(_4>f9Rs#oJ)*vL1EP9s8DF`rRYM4FQk}ad|g@EkDfK| zHYPYQ+ZLLurT{h}HAh@mH|||b3@_{KEwB<(CYa&+RBIFw+V&@VrE`PLes^wZ3K8a7 zqbic-V0hFqACF}i%0!vXi^L@)0`rY(6t-n82K!9QQ+lm6O_JzE{=)tlYvl9UbCwVtrDEvM+Jy z?2>zDZ}SnRDqgwAoT?na&dwhDFz^x`dGHQ8kFsLDFSj+H+l?!+-m@%8%Ty!_ET3M@ zR!0ck!jGkDd@U#Unkb#7NWz^;r9{Dhi?k%K-kSB?hS5n!1$!6Cqu3vK&UOdb5nJ`; zR$g89%{c(xo>5_v#bUUd^zIr3Tfye2B^SPZ#C32c=E~LNzi{7QPHUDaPV?3@baUl? z0hXbxuZ0DPO&$-9s(smS-~S(&@f&aixZu6TP;w*q{982mFYb5tjUFIH&>&|G_zN!l z>o;f+Ao=$pF4+B+=$?m&zrIn1^A=-3TH$x-`0M@iSF)8DI6W?V7-RoSDFF^biI@K% zB>l@>|MgWbD}cWUk%rxW9-4Rp&>sAE+JD~>u-mg4aI8Pu#eM}{q0lkc$3XS9WHme2 zcH1ugc@_X$Yd7=Tu2rv=h6$AHI^;r)suc2fuyPH6y~5S4T$UIy;Lvtm)n(&>>Sxr| zX=%NKMpaz&$#70M&TxaLWn^m-tU^tGAMCE80|A~@?&q1Qnx!`^;GHlR`D|8stM3K@ z+!SNKIFTb6PU&2c=(I1TX3+n|>Gp4o3W{HmoiX!`OqmStG3H*L2u32Z7@E}kbqcO{zZ-1J47!H4Ku7GHVy{=J;FwKYpf$yKaQ z>_Ku`k#%3s5*DV@Pb0$c=e#dhXGz3hkHaawDiC+y(N5h5*gx`h97tI70r+ssR+2o( zTUZmqae#(KfHNO8$C*ARPuGhJGXhx(yXl7lVpxj=UxN@ zC`U9BG_qPJw^khHzQh*BzIt_d&-M%Qe4OdVPnKdV%?5*89T~(lI|F;~8U3nQ(X)M4*cm zgFg3}_k=&VEDx@D0}2n<%q3-#jxq$}e2|NPHA6l}etn5&4o>34L`sK}-a)r$flRmA zN%ZB}mvV@PKSSRiZEPq+%lp2vK{ZBIX2@juI;~_oOGq6_rb+?S(Xcp8{9Xr)Q0g7-Qo*>Wgy79o)wmSLR zvmd9Kog5ul9IPQW3{{#NZEoPA&|+5VlLBYLHRN0ob&f54k*}Jw+_mCUN|n=SJkgrP_h3zy3^bMU_L0j zu~@mtsJ3I-j~BE-fWl)&CtB((N{$m|7vx1&Pc9vlkZ>#0BpO3}D6J}yDir5oVw_Ml zjhmT_r21B&ZsK7R?ug!w68c2oStgLp0@3>Bq8rdZjJE-Of!b#t-m{a9*I7T?tv&*X zHH6J|btgCs&oD%a=KO*#xEg$g55Dp(j=!+Wi!b64{c;|x-)Q^88=9G88a62fT^O}_-y4wq0aU2Y2VcKF+S)z<#8ysjE@!)5xeXoiBfVzke2)5RNN{jR$>^xwV*;LH zQD5XHp6`TTzZcN3o_d_-nI`vbI5fu7+1#-2i%D88Yovd0o?{`n{g-wo)3Zxrx~2F~ zp*m;Q+KLBGHF|veK${I`t>9(_ML?I}GRs!+(?(q94FKp~wI_QbbDq7iEv#;0so!j4 z{$^eTj>x#{4mPW-l7jmd!q)^%P8W`;1u+CEPuIMDCHFkl^BwFz`6a`|`UU6wNTYuU zR+!q%Q|@KeoiJ}Uy>`{Jx8JgXRzar1gasVQwuvU_1uFF`A@eFc&$%@QD;*|(#iLvC z8X6iOXhkGmf+FXA593~bM9L`pQO#+#7%5=fY06M|D6w@v_{`*yCUu+sq%h%x_PB3U zY{I&$?9X!ynkq#@b6AfxkG*fu-|K;WrWTRap?MN2Z|9-&^y_q~X(OY0W=pJl;w21Gt>^m$~|_XAe_Ga@EdW`S8&>zzi${)5RIA?aVf0eU55{u zaBifFS%s+lsSgN;2Y!XU8#-w$coyR*4>!7x+OGQQM1_tK;!N24g&%O|Iz}&LHDsmM z_cONGFflU9eHk3aMsJmPS%d!sN|L1d5SGpyV6ZB>(& zOfjIp?9T^yN}ILUZEf;6h~rw76w&xfY4rX%*l96a1;ei8Wr!n#IWVZ#J(n0G)^aLaS z%+RNT8;VW4UFnov-cA@^!le~Y({w*O&NpQq5MKS-HqR*Hr$h!#QQ&|0<7Z_kv|KTP zSBc7F_680%*5`MgdX$UO?nu61RN4)<@H$; zREJK@elvx(SceXni{-?&`Q0G=nuC5!2~aERf~vMU1NaWtfdCNFh3V6CpDn2Z)`7=G zr^YzHm;|ai)#puOe3>`AD49_BJ$%7UVS27yTN=5Oysd`6|eRTb6mYZATxR!_gt;!he|A-?Lpk6* zv$lM_?{P`#Mj06(?-+WR_r2oa74p2=KFJ!0;7zaAFUM<9HHm|Ovorr4pV0V}PT^d3 z+l_1B(x$OAmZm}FZj#&Iuhpp8EwLx0OMkizVPvr)8uDZb6_-s-O{Lj>mx8v|_=~u+ zpE37ZDwo$I&Gl0hve^trL!*j)9Kd{VmWm0_);||mX{LPq>KX0<<<>Z+WlLS)wMffT zuc8{Eg^M`_lQTN?caEi7RU%O36#Ofs&2t}qH+SiQsZ^I37fs4nR+x53TA8mRKjfyQ zsIy4Gj}0!l3dlHNc^8D@guOglwqE+{SIE>yE4p3*>j}7r4LFSSvNGIZ~5|}+cASv-}$IZ!~pgZs=NOwjhbAIlAc3WiIig8Kw3LAD5F{p;P?_gdR7f%y^ zFif-T=64qmv~&r~^YZrJ!s+$f@o&m9%+Sl!j#1LmQHIAJ8Fam}!upPfef?J`M!mB~ zCbO{mjT4Q9xWd%CV3jbimI&|LAhfPgdjucIYEurgp_c``ORSpq(5qai*E<{5-|rBO z6wx>9939~NeEJM9&-4M}%CNlF-`M^Qum`Jgv;1@X`KJ`!H%^5bF|-nt#ePksV6++d zc8Z^QjzsEiO?A8d_bE^`|Ia)$$m2Rqszhq8MJ0=VsW`8_F>^VTM@^?k8s@gfe8Cex z`nlFiL0&mU;Pf;m0lBcS5|g3kl5(3mjlsgm!&maHt=4n}TQFJFU`B7Pd#DTBs4-T6 z_}8%~Qs-gfJSw4|nE=!lN)d4O%F&)-8fu@N+@pokEc5A20m7@iytbA`kh)MZ&-6r> zmIJ4$&!+L6S?F?GHltw|*|>>ldTst~O(m@J5-VS=$sR+A*_Nr=yGeCeR1hKi zVqT9;;m)~toVf`2ujoY=Ixv-thPMA&G&b@+N+S z`~q?E&)m?j8Ulg*pg%Av%39OYc`({(^@3%^hoex)klUQIIVfaW$JZx9k{fNoSH%;= zlN>!!`S0sFqEh<8?7znxh30p3#dCVBqwvg~8?_@Fh5xOr|CNnFD=sq15vNuVE9S04 z<*^g9)wAfc z8Lz24WkpZ+O@YJ}j(*^Rk@tp_!0FM}+;UO9tF^+!74^rp>T94Jjf91sZa>Z=?jIa# z**-myBMT#EY%>$-3j(#ZIbIS*$@6du{ ziX8!q4pI+fPS)&dl z9WQY+43k4YkdEfw=Z|X_XL5x6%5WMr#I)^F?f{yLHpD&rucb!6nz{pu4mOvj%hcX9 zb8~aO^?rV6aWT5jVbNbW`66Db5% zK7Z>d0srW?ICmPqf-Y!bo4sCcy-gqCNS#-7%rL;e0V}tL2eS9VSC?IVKGar~{aqsR zs|pQp1g%y_sg-@kLEnQlEsRP;4}C1rdUArAuT@7wbf_c=ax2C`XG-h-8IzGIZa$+{ zKnUM^r(h`Ya?t+z-!Can!-2VmmGVK~z2McWOXwpM2cv7s>j2T;+WFO922rRU%(R>M zQodb=MMMD_``PwK)BFXcOGv>~O5E3rISw-f7;^2+^^ISQ@Ev^x3 z@GKCgUO9%i2=n%sxM}c^A8Ix)pdJ32P=(CR>(~q;VgS_)kR|;pfejYrPu!YF4rdrB z5B=0TEw6}OqMQ0Kw~Vj8@S_@vclhsH>o0zU6^aoyncqr=y!H#CjDSI-+u7h9S4T1w zNVY6N&+n^w;AMhq4r`%YU2iFcTxAn@?Z2AS%7kBK&$B(=aTdjMP-%{?8P^j0N(jz2 zl<3gV9E|Fx5KYl)3UQMEkH4JRG2!*8F+D6RLG7jfoam!P88Mp@ocB|qZ0dLv9`Bf<9FggGFd(mI(f zhu{WhI8=VrdrEW@%wIc|-;%l@Y<{0g4-u#YF>#py&-#^bE&-2G~-+$aMUDxM2 z&(C?D$9e4Ief&-@Z&6>bk{x2bv#_gY7x=A>M_V_9vMP@jcIoBE#G5{d?OT7MBp%Rq zZSH^%4ReV=$ zp1yBw6bPwOEZ6Z!V;QKiDF<|safY*_{U!FdAgYMCsQ}?gW%PxghloYafzem@Jf_X4 z<*Dq096093&92@>_}fVgSIJ27?F5C%WOLE=nN{tP6(e!NO>L`}2A;}M7ErfQq- z_7OpuH-UEi&!QZX@nGUgKa4UU|2l&b4c&AhRx+2H=3WEZ+%TUs@&@^_Ha#1EULF zseexNlW+RWqrJ6M&yc%2AMxuA>SjqbDvbO?S8P2m>pPkm$!5CBmSu>(jiAmBd1GLC z&7W(^=J{W9j?&k7G>-o+rO{PrdXuYL{2{v9X&D*8w`V>+DisJ8P ztI5%ORF-b+x1Frxu%z7#83SO7!JFN_v0) z7JDB_1Xj>*JN6%+fB)x0#JPd{8i^nN*wm|f2aQan*G1sa7=kx*DptHqiHbH zOq6HTepa(|N2o`wOiYm6DJ*#YUUC{JZN-;gSsXR_>tiFNJo(jk<+-*H^e9(}qux}h zIiE;+l~Cnic}}LZpa-m)ev6aOVt=r2F9eoXo66`rhr>cWBDCnqmDk(9S?adaWS)0@ zrojk-ul>iz;<Dxh2;=JcXoB3#Jz~HE32AG)=6T**4Y;c{&h+&9 z+p58GWxd@mM-gvwx^8Um?TAMCD$T>x&N5dU^A#NlEHXC4# z>7+a=cs6@ggA$vmwY3#dL6J&QG;-Jcjt-aIc;lejz}CQvR=(2Y{hj8k7f^kUmcgv+ z@vPhx>+4TL;u~)EW&1Bpm_{@*u z)2QljP23;!^41Mo9@DZTk_4_&kSL%LV`EN~6+?!afE*a3AvTtJd&Ac?%dS7TdT}iL zzTwN~`#5}a&gu>9bW$1DFQrH1eB4ulkV{fh4Zd{UjqkoGP{7*}x!P(76|`Z8Xic_c zO|7i5AwVN{@CYpjQms~gF-ZCb}fc%*wW0lc(l9`1gP4M|X6+Uc?Xzs{qIyo##%jWs>La zjK1Ce?z${g8(T(PKlq)e-OR2&XT7UhslAwNPISkxdE{)t0(M)@_F#4$qvAMznovbf z_O_4G;=wMqA<7pdVK~A@Uqbp%4)Usg3&p@;ci}?C;$z{YV=*nF`{kR8(k<*c<=0$R zrv&ui0)n7@WC$r zV)K@>niV6KKO-z~HeWKp-qf9q1mj=|0xK780C-(8q`=!jnGJ%#S2OlCR)&zoKHiS; zn(}jbjFan@$G}C+vRjcW^JiPQxW)wF>O$+Ln zzsD$mXqbS%N4X{zt@#{1IoDTAv1;%`4({Wrs4Rqr%}|(|x8~g*GJ|9sYeE&iaMPS& zH3s~KpC@?p9^B`qiXDKDi`G_TxYWtIboIw3(qV2#Hx}|4wFmHOjga)0p#-ycj}P=V z^mcxbDF2zx?#7C~(p+bynpy${S{36X^JNR+pzvS)YOn%$;mxJdcRZHqFJ4@27MP$} zR?^$6iOBdCEpZ-?w24VqPK_EvLT3LJEvedb`5rB?+Zox24`^v=nAUx!tJv5w-Alk} zi$Cp-@iquslljOu`>~RU@9RB6{&(jR{rYLcB{7M!C5ItM5(a>NQc!Bcp;hqK4OA}; zKI=gXzM09yz;J+Hkk!*`T#q3*cyC6Ch0HYy4kRj~gGXM5MMlt7?E&C2>$GbmL)Hip~~$&(#s#STlI z>MzMpoxXgljh*<6NbB9HEU|HG_jkceXKg=UUJh75%I05PG8-L$>e^eUFV_dsaq|z} zF@$sxU;@tAyf?IVuX`ccAyN_5QF4u=d7^abmdgWzp>G$Oqq8|hFcs`C)8~ma_4h+R z5(LcN_Wx`0;-wirytqx&^bw2c_j!=3a?8We1RHp;Kh_XgeoCgH6-#P${ngH;yCo$h z<0e;mPbmu{maY=M5--6*tkYmn82jqLyZo`<-0%Da?-gfjzP%{xTW$v-iwk-ST#PiY zDK*!U&ZJ&;ecV@QwBHu+{@@S(N&=P!uah{`OaDbD(%;_zE*M^G|1aN(@rewkzyD%S z&WfUCG>z8lsdv3L!nCjCUKOLz`H0#5|{Iq`q5!c%#Nd(QbUj}S9 zf}%I4zt2V=h5|09+&Hc^M)vkCMiR-FTOb_8AxLu1uEe>sur}g9(>x>l(nbF%)%Tnk zG#}#m@9&$A5`Y}cbH#1N*7{A_3>Uw%xFoIN;iJql(){ZROd@WzQ{YSF>ukF2N_%WF z$|*0U7YE5JI$w91p$=mBHX zL*P^3o2druuA;$QOMZbpuVvlGk_qogSsHp|1;Sg1&jmqWwiV-u-* z+=07QYxB4b0U1|GzYGmHpLY)C$HBw*M!(i3CbChA!M^21=&PqltaSO(L7lg6+s_>M zz|OXz)i4$?jBEQS&E{_k!XSL+A?CQfWH?)whc`txjo8r z6BlWgDc(QgkKpu;6LxvyRVjXB^h>U7HLXwmp*2A^D%Yrme5ySOPW!Q5+{K;eeTI8& zRkcgJ%XZN{#S?G4OZJ0!%!cc=Q1SQdm!%jL1JF_9=JWj}JOE8$m)9ung@uVC{!)BH z&OuyGRSc^jrBwVD9?@s*rxTT$Qjw@rB?Et+F%WSsuB!JX(`AYh2D- z(797fUNJ1j)S0DywBW_YZq2%~P!0QsuI5!g^o5`_Qvglan;Rv8&;?h8}CDfB((b zM-#kpanR{a}K|IOENF#-5^UXJfu2LCi_$4f6P6C$U8jHBPk{I_RXd0>qJn?2Eg z8kLHi7%S^jvl8z&qWQ7rZ*M1fnjWi{N7R+%52Gs9pil|C{Q?~R3bt=ua7npX;i=e=G)tyAR)$@dm3Ny z&m*f$cM7}W}dXJN}ja!JtckS zt4h=r$>cb`OvCT5z1ZuZLOme6@gCAWzR$B;#Io)XhI(ckzu`~GXA{x)@cG%dg)>FjYI>u>La%8b* zuBtlbeuprXOq8EuvrqQ|Laxr)Gu12wkrjPbU+$H8Zj~ebt z8v%muBABk!a@9#7i}#R;fXv)`dq`=iM<5pCxBDkUH*+%xa7qkt`D&rMz4G0Rce=0*Bt*;*H0`1mIDkhK^RmxDSB{do>oWePg;K z-4@0zOHQT6Z;eMo{tOV%o`fGNq)IQ+FW0@N{8NL zta4jAV+*)8-x-U#J=H&)CHsXZptUiDGZgi&Z+lurYhbLW(%Y)IUOhuGvEIePSgHai zcr7gIyfpfvHi$v;4M5&dnGWI;Vxz_g`*}7~$BeBco41WZ_sKUMN!i(dd1X%ujRLD{ zF9K6C?!4Dtst;GvO$kaT$QHx5H~_bqY<9FWQ@tMW;7P$K^H-J^U}7&JCC(bYPAZY` z5@p)GP0}K)5w^yux2E-8`%70wXqMtHtm;(wd0`!1@9|Z0?Ln4(bZ3M58EjM?!YK{* z<>N(!)v|St`_R})0m!`wl-7uYN>T00R$i@aPnT{+9q&5!C?h<_=AQxkGO9~g*>9|F zZK_)CJtqrPFLZlALa(R;8%wY@2gnN%VUCl}e6D~IX$W{Xz5t=gqj%@i0|HtJB^+P& zFH18ms)e>WRRTE~W9%_M*?4sk+e@Qeb5-lDyw2>2%z#-e90Io1tc1Dg6{9TeVlG<1 zb2kBay#t3Y&RkO?w@NP@j&&z#oJx}s?8>jIY>+M?X#{L*yBX)lnySmkSGX;@6M~uh+609 zsbxJ6ll{rG4Wh}V6ui`2HTzc73XeQoI1_2`vKPxx(=Li8$9c;D=Atuky$;t??!@ zZ!-7vn4(Bz-`!i8Th^~?%&O`j(@D=+Zgs^KAp0r4(Fv*vTp6BOy6Ro6E*IH>k(&gf z2e!hKg@xWmbK9(Ts@H=_avZYauG2s*d{(5q;8YR<-2VBawzWT0brh#)pF|rNV)k8! zs_Ivr^hy@J36gh;-Q^!D(C&p1gr!jabJ936DE8=yy4lW%&`Py2d!I_5x|0l5>S1|g zS{xW~6x0JGzi%f?*3=X9s`UqlG#6b%D8m|mDtOyWt>=VOKhJn`Y~R*7$JuTUcL>es zCi0j`8?Y1j^)FiQSE*zY2obp`6#A-h{k#bnORWUsfx}7^o$g}!`iV1}mRk{5NAN+J zA>KGV9Of7+U~dGb?1gO?NOO${?sH3_V2pKJdS}_@b`qVCRo$(0NFs3FKi6n3qllVq z#qxc#XSCjPu{u`opJaxGsUqy?T79UuT2}8nUZvJ_Q)=N}hFZ~Gd}5X&kk+_cPGGrf zvO-2{Fa++$5T-BCW!X@($%;riVV;WUH&?LmXUuW(pSOyo`NjZL2ICZ zWfX%?pugb}A@}9T-jdrnx}wCcfiy$S6*rmx(JB&zQKpnT0R#Jzu8yqi);aS+Zzlgv z31uggJ&nS#1O3ikvq6Cam-mRk=o7j5^By}JX*oH8;CQGFW|HNLY&nR+**k6X#xtJS zRHRjg|x7&@(N_5@U8ahjn`zLA+1)|_mgRU)=cm*Jy)JSeC;RCgYGPL&h(-2Z{`aKi( z4iC|#MMYLuuSV1*=IqOs7mi0B_U)*{22sq(vptH6)V~8F)IXBpK7>+G1{D*nb$);C=eDDgbtgH-O zUYtVO-BowI2sr$zOUG3gCmYpkcaqnwl%h*J*8}cJx}9^J)GkStE>1h;I30}2E-AfP ztXkOSU9BFb{t1+y%LZj}6^5^m^Vj00?woO?JpcT~^P+`w7b@?(uBt2E-{kwdC9n48 zKRSq_GscQj{Ns_qG0!)ZLLR&@i&+=;!F3V(08017VdJuno2StR_9*XaYx#OU6poqL zaLu7uN;H6i?FkrFeA)k8SjR2lB36)F@5pnrT0VE1Yx~XLBYQl9RqH{V z;*+i)FITAE{dw!Ei#R|th^QzxsrB;oouC*X=jJS72Ses$1Y^@`WZYW6Wh?UylW+DB z+N(O80ME-RJ!Th=cv1!9z2$wuWY#A?z70cU&LX`58sPVV70XbwE%9ZOr@-#f+kW48@yAR*|7cAIi5%N7XYk8i{A$u5Ow1t#IEb;C5cyAz_RAl!ATxT?`w#!3 zPW;>-v@tCB|A#3%vaB@)m%Rc&pkZY2&-3z1h>MFS`zjxXjmqExEBE$|LvY^-P|dok zXjMjRlq#9cUJq}$@^Qntbg3ZS$o}H;`*XP_ zAD&YR*xf|rwk;@7<7&z2>8y>S(8YygA0YBaNa8mx&q5%-WRvL_{JIwfX%xQER;8>$ z@1Zgx@!7LyO($cEdu=wvysFj6HS&$*u120^LR2q}A`8tJNNXwKm6<5g-&=}U1i0Nd zfSg0Oy-?*DMd-Deheh$y$|4oo)W(&`gIB@KVEYMI*TNX#pVm zF{q*ZmFpD?h*rkmD~STSU}Jrf{S2J(F;78@aJ1~K^4y=rehPhJkb?iu40M}P(KQ0r zg`c`pswh!aa!yrmNYdmmfLraO`DNLVZd;=t2DOE@UvB^!C{lIp4YjpJ#Rcw85nPdW z1s9nWK=gh%v^(!)yEztNOfiad0D0{m7aXd9!V#3Ej}4LeyQSPv(0VLgiUDn4j`u!J zScuRpWq9JKB+XGM)_&-~8D6Xdoo8USO#NN6oxSy{K+&B~M{*HWkwoF*(Wxteh(oWF zTxuegbf+JhkL6SIPAybD=B~W39ld~br7GWD>$A)lF7NaEr8;R4m)$IV*Syb>> zmPm?mXlK&3SfA^23aPgr>}B*P0(O^&E`1l{UF8YLl<%!B(B1A(%7qw+h05de_s{S8 zQSq|1K?@1!TO`yBIF=T|171Z4+4rKR9<3I{K+yX_?&X6}HkXIYN zf5AG8(d{%gwqn&G5U-(Vs=c^yXcAR;P&EI3_&(Ga(e_M(b)_ZKAOZk&Q?tteuWc2g zw-q-}tObfit0oEvN#T9uIcAa7bOp<$C(YW?Nx2v-j65l*tXIl6K0jWJTQ6r8S&nS6 zSbK{g=@solHzm(#H`5JQs;#(Y^D6@d&lVqGVc78A$BT-x^ZM`g*+}ynw_S^BV8{}( zX2O+~21&yBDFo3cx*^N%6p{8mbUQ0oa&K$LH$8sA#$cxC{DMkpd&D^Y9N2H>E?Uyd z>d8!UewHV}g<*`Bl-dEh+1Bi%`*65C>+p^x9B=`<2~bdg-5lWZ8lSm*=7VgPG8lc9 zA^c4xadEF@xE*D?ZjytjQBh7u#0z5pgEne8<6r8r! z^%cgyo1x8?QiY6oPkY}LS=lKuA?q|#R?Z5E!EZNCO1!UKdD>J%&Ct+r9=L~{CgU;s zmt;6d65MQBjn9$51&{Tzo{$++mYo)lwR{V%RiaE40>;qn9KL=v8TPRro9Nrf>s*7F z*WtImvJ1W}oKp)GE5$cl=u^&{ov~yG%AZKPwzs1B?djDU1P<&*`31gMnCJLN*P|e= zw)WPI0mr_qLT7*^Zu+=9D5xdl3b9A6Ww2Ge(1kc{N!$Db4$6E!i@+SJ-ql>NwhVp) z%B7&@aB_rRL%^L*RrRkr`UgO*UA~$WUt&LDWPdk>pFOp%gx&B99SWx?uNugP`iSs~ z;#yum8N1reB_}CYmv>|X^nCTe+B=RBGR!d z$&Hcb88H`=m)wB)8pz@T45|LD8c_wIxdIE3a=9?&W`XpWi_vWQg1~DU$fUY7Or6rbI?tJiDbK_P;LHAAk`<#t$@e8@tUHNn23ldh&CAM`;-5H zAA;6_PR&X>Uk7zwee!V?e2`^&@##DmOZj0S{s3G;^2?=t#h<>cTOJm>2i_=648m8h zVV!UC2MJQ&X(6oY2ke5H01DX!w_O1HwJ6}FH23ALl~mE#4?Dvk`z-pCojHR!6+quRi-`>4}o1>4GTioulSuKqpAhH>El)RIFc#n%(NR zZy9)-oiHe)Xdy%<}z{oD1ot z$^5S)2Dgf@lgOARU!=CmN0uyupAqb$yi}@b&*|)s9a&1 z$ddV+-3JSEm~aJbjW(UBsVLTphj|5|*|BZybIHjC6%OvIG79m@1#KSxjJf%-y)mF| z$cJvL)ko`b7T7|89xI7GyxowO`1y(W;dezKV2){;9wo+FH3!O;BS^x}YPazQ7^_+! zWGd4OYJJY^RCKZiudEa#XwKL6OP>{ z3B3fZRb})9fElaM%k>4J60FM?uS8>+lpdCqEwxqFlIc>WJ}4pEC&NwEbH>v&8l(}P zii`n-R5g`M<35wF^xI4gRe7%6t|=}RvbJQosf*RI0A$0<`en}AQwZsE2Hnc8(zvgD zh|U@Tp9vL$i40+q#3thG6=6=(vad4f*qx#6K?)?E&CezxjO_wRwzsB=`|V`c3dC4L zz6)_}Wdk6b00$Cds8B`3T9F!3B-^tEqO&_ntu)RB!4+(8lZguC9(Xtig?7FD53NGp zQ6TS(rXMJf<`&f|Fi|Q8YdLqhS*SQ%Ypc(CUjsHqun@dr0U z;x;%qO@(y}BFHDQg73qY6{Vo3k}XZC0wHVFNL8BqN+~q+$X`8QtY<3C@7m^UG5$WX z$A99QOR1G?W7)t{GW>RJc~Cr9m?C6dcum9f zXqvgR;B{fd4(;$omu~EhGK)qM8PoBasYHL$p#He{{4rO9cSuUXd5ZVxsc}(6L%o2s zomc!cr9{6i_HV=)2<4bBh@1)$x|Tm`Vr3O@#N*4op4>LMSfbQPo5AT&E*oNCNyHl; ziz~^HE_62lMUw}Nb&Jb#E}I`-*^Yb$pVec~gg#zFuxxHF=cks4x9_+Doa5WOhfOa` zBYht!FW#{+*F!u`5E+B;I~ky5JFX4OmNrxIS!f_V(}J3{SvQdWrbWkT7s^%r^(Lck z5qLQ^c_^DhFhFYGCfQ)TjC1Og5Uv!^Cf5E|SJmLwQqXxGM}njjiU5l{pY$3QLcVG^ z-8xw3PxLuw_6jF}x2@r*)Idya#%r(E6Nk)X;HTtSjM8xT@eYXj4O! z3#{hF#`)S6>YdKv$ z^GYtZ`;RtpvYIeFQk}rU!mE_Nd`TrLg<1x4kXxiTCe#v<(exExSSp@!?#@k=tIAE? z2<61m^7H5*fWrog``ucx!zssMJtT4LzbqKokUC;wEY2&UX1IU)60t-CSc3n1L_A^^ zZ?H#swv^ca^yORNLQR)~F8}@-U!O$tfV6r1AyDhmpS}!$K@a;f{%H}uC&8Zj-&Y6@ zBSpju|6ijj{sjW&#!8~ve{BoA&l51xqVAn~1RL?6`-Zsz`VM&_UEx2jhJT*I(7>QH zq|*QSBV-s-anRldK;UBi< z-y{6@7XE<;{d)`lWu$-L7XLER|I4y)c>jRHsX4rlhqeC3g8!r? + %\VignetteIndexEntry{ggalt examples} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- +```{r include=FALSE} +knitr::opts_chunk$set(collapse=TRUE, comment="##", fig.retina=1, fig.height=6, fig.width=8) +``` +```{r} +library(ggplot2) +library(gridExtra) +library(ggalt) + +# current verison +packageVersion("ggalt") + +set.seed(1492) +dat <- data.frame(x=c(1:10, 1:10, 1:10), + y=c(sample(15:30, 10), 2*sample(15:30, 10), 3*sample(15:30, 10)), + group=factor(c(rep(1, 10), rep(2, 10), rep(3, 10))) +) +``` + +### Splines! + +```{r splines} +ggplot(dat, aes(x, y, group=group, color=group)) + + geom_point() + + geom_line() + +ggplot(dat, aes(x, y, group=group, color=factor(group))) + + geom_point() + + geom_line() + + geom_smooth(se=FALSE, linetype="dashed", size=0.5) + +ggplot(dat, aes(x, y, group=group, color=factor(group))) + + geom_point(color="black") + + geom_smooth(se=FALSE, linetype="dashed", size=0.5) + + geom_xspline(size=0.5) + +ggplot(dat, aes(x, y, group=group, color=factor(group))) + + geom_point(color="black") + + geom_smooth(se=FALSE, linetype="dashed", size=0.5) + + geom_xspline(spline_shape=-0.4, size=0.5) + +ggplot(dat, aes(x, y, group=group, color=factor(group))) + + geom_point(color="black") + + geom_smooth(se=FALSE, linetype="dashed", size=0.5) + + geom_xspline(spline_shape=0.4, size=0.5) + +ggplot(dat, aes(x, y, group=group, color=factor(group))) + + geom_point(color="black") + + geom_smooth(se=FALSE, linetype="dashed", size=0.5) + + geom_xspline(spline_shape=1, size=0.5) + +ggplot(dat, aes(x, y, group=group, color=factor(group))) + + geom_point(color="black") + + geom_smooth(se=FALSE, linetype="dashed", size=0.5) + + geom_xspline(spline_shape=0, size=0.5) + +ggplot(dat, aes(x, y, group=group, color=factor(group))) + + geom_point(color="black") + + geom_smooth(se=FALSE, linetype="dashed", size=0.5) + + geom_xspline(spline_shape=-1, size=0.5) +``` + +#### Alternate (better) density plots + +```{r bkde_ash} +# bkde + +data(geyser, package="MASS") + +ggplot(geyser, aes(x=duration)) + + stat_bkde(alpha=1/2) + +ggplot(geyser, aes(x=duration)) + + geom_bkde(alpha=1/2) + +ggplot(geyser, aes(x=duration)) + + stat_bkde(bandwidth=0.25) + +ggplot(geyser, aes(x=duration)) + + geom_bkde(bandwidth=0.25) + +set.seed(1492) +dat <- data.frame(cond = factor(rep(c("A","B"), each=200)), + rating = c(rnorm(200),rnorm(200, mean=.8))) + +ggplot(dat, aes(x=rating, color=cond)) + geom_bkde(fill="#00000000") + +ggplot(dat, aes(x=rating, fill=cond)) + geom_bkde(alpha=0.3) + +# ash + +set.seed(1492) +dat <- data.frame(x=rnorm(100)) +grid.arrange(ggplot(dat, aes(x)) + stat_ash(), + ggplot(dat, aes(x)) + stat_bkde(), + ggplot(dat, aes(x)) + stat_density(), + nrow=3) + +cols <- RColorBrewer::brewer.pal(3, "Dark2") +ggplot(dat, aes(x)) + + stat_ash(alpha=1/3, fill=cols[3]) + + stat_bkde(alpha=1/3, fill=cols[2]) + + stat_density(alpha=1/3, fill=cols[1]) + + geom_rug() + + labs(x=NULL, y="density/estimate") + + scale_x_continuous(expand=c(0,0)) + + theme_bw() + + theme(panel.grid=element_blank()) + + theme(panel.border=element_blank()) +``` + +### Alternate 2D density plots + +```{r bkde2d} +m <- ggplot(faithful, aes(x = eruptions, y = waiting)) + + geom_point() + + xlim(0.5, 6) + + ylim(40, 110) + +m + geom_bkde2d(bandwidth=c(0.5, 4)) + +m + stat_bkde2d(bandwidth=c(0.5, 4), aes(fill = ..level..), geom = "polygon") + +``` + +### `coord_proj` LIVES! (still needs a teensy bit of work) + +```{r coord_proj} +world <- map_data("world") +world <- world[world$region != "Antarctica",] + +gg <- ggplot() +gg <- gg + geom_cartogram(data=world, map=world, + aes(x=long, y=lat, map_id=region)) +gg <- gg + coord_proj("+proj=wintri") +gg +``` + +### ProPublica StateFace + +```{r stateface} +# Run show_stateface() to see the location of the TTF StateFace font +# You need to install it for it to work + +set.seed(1492) +dat <- data.frame(state=state.abb, + x=sample(100, 50), + y=sample(100, 50), + col=sample(c("#b2182b", "#2166ac"), 50, replace=TRUE), + sz=sample(6:15, 50, replace=TRUE), + stringsAsFactors=FALSE) +gg <- ggplot(dat, aes(x=x, y=y)) +gg <- gg + geom_stateface(aes(label=state, color=col, size=sz)) +gg <- gg + scale_color_identity() +gg <- gg + scale_size_identity() +gg +``` + +### Encircling points automagically + +```{r encircle} +d <- data.frame(x=c(1,1,2),y=c(1,2,2)*100) + +gg <- ggplot(d,aes(x,y)) +gg <- gg + scale_x_continuous(expand=c(0.5,1)) +gg <- gg + scale_y_continuous(expand=c(0.5,1)) + +gg + geom_encircle(s_shape=1, expand=0) + geom_point() + +gg + geom_encircle(s_shape=1, expand=0.1, colour="red") + geom_point() + +gg + geom_encircle(s_shape=0.5, expand=0.1, colour="purple") + geom_point() + +gg + geom_encircle(data=subset(d, x==1), colour="blue", spread=0.02) + + geom_point() + +gg +geom_encircle(data=subset(d, x==2), colour="cyan", spread=0.04) + + geom_point() + +gg <- ggplot(mpg, aes(displ, hwy)) +gg + geom_encircle(data=subset(mpg, hwy>40)) + geom_point() + +ss <- subset(mpg,hwy>31 & displ<2) + +gg + geom_encircle(data=ss, colour="blue", s_shape=0.9, expand=0.07) + + geom_point() + geom_point(data=ss, colour="blue") +``` + +### Step ribbons + +```{r stepribbon} +x <- 1:10 +df <- data.frame(x=x, y=x+10, ymin=x+7, ymax=x+12) + +gg <- ggplot(df, aes(x, y)) +gg <- gg + geom_ribbon(aes(ymin=ymin, ymax=ymax), + stat="stepribbon", fill="#b2b2b2") +gg <- gg + geom_step(color="#2b2b2b") +gg + +gg <- ggplot(df, aes(x, y)) +gg <- gg + geom_ribbon(aes(ymin=ymin, ymax=ymax), + stat="stepribbon", fill="#b2b2b2", + direction="vh") +gg <- gg + geom_step(color="#2b2b2b") +gg +``` + +### Lollipop charts + +```{r lollipop} +df <- read.csv(text="category,pct +Other,0.09 +South Asian/South Asian Americans,0.12 +Interngenerational/Generational,0.21 +S Asian/Asian Americans,0.25 +Muslim Observance,0.29 +Africa/Pan Africa/African Americans,0.34 +Gender Equity,0.34 +Disability Advocacy,0.49 +European/European Americans,0.52 +Veteran,0.54 +Pacific Islander/Pacific Islander Americans,0.59 +Non-Traditional Students,0.61 +Religious Equity,0.64 +Caribbean/Caribbean Americans,0.67 +Latino/Latina,0.69 +Middle Eastern Heritages and Traditions,0.73 +Trans-racial Adoptee/Parent,0.76 +LBGTQ/Ally,0.79 +Mixed Race,0.80 +Jewish Heritage/Observance,0.85 +International Students,0.87", stringsAsFactors=FALSE, sep=",", header=TRUE) + +library(ggplot2) +library(ggalt) +library(scales) + +gg <- ggplot(df, aes(y=reorder(category, pct), x=pct)) +gg <- gg + geom_lollipop(point.colour="steelblue", point.size=2, horizontal=TRUE) +gg <- gg + scale_x_continuous(expand=c(0,0), labels=percent, + breaks=seq(0, 1, by=0.2), limits=c(0, 1)) +gg <- gg + labs(x=NULL, y=NULL, + title="SUNY Cortland Multicultural Alumni survey results", + subtitle="Ranked by race, ethnicity, home land and orientation\namong the top areas of concern", + caption="Data from http://stephanieevergreen.com/lollipop/") +gg <- gg + theme_minimal() +gg <- gg + theme(panel.grid.major.y=element_blank()) +gg <- gg + theme(panel.grid.minor=element_blank()) +gg <- gg + theme(axis.line.y=element_line(color="#2b2b2b", size=0.15)) +gg <- gg + theme(axis.text.y=element_text(margin=margin(r=0, l=0))) +gg <- gg + theme(plot.margin=unit(rep(30, 4), "pt")) +gg <- gg + theme(plot.title=element_text(face="bold")) +gg <- gg + theme(plot.subtitle=element_text(margin=margin(b=10))) +gg <- gg + theme(plot.caption=element_text(size=8, margin=margin(t=10))) +gg +``` + +### Dumbbell charts + +```{r dumbbell2, message=FALSE, fig.width=7, fig.height=2.5} +df <- data.frame(trt=LETTERS[1:5], l=c(20, 40, 10, 30, 50), r=c(70, 50, 30, 60, 80)) + +ggplot(df, aes(y=trt, x=l, xend=r)) + + geom_dumbbell(size=3, color="#e3e2e1", + colour_x = "#5b8124", colour_xend = "#bad744", + dot_guide=TRUE, dot_guide_size=0.25) + + labs(x=NULL, y=NULL, title="ggplot2 geom_dumbbell with dot guide") + + theme_minimal() + + theme(panel.grid.major.x=element_line(size=0.05)) +``` From 4de318ada79e034b876e2085c18ac119e9e34c26 Mon Sep 17 00:00:00 2001 From: Bob Rudis Date: Mon, 13 Feb 2017 13:45:30 -0500 Subject: [PATCH 2/2] fix for travis & ggplot2 --- vignettes/ggalt_examples.Rmd | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/vignettes/ggalt_examples.Rmd b/vignettes/ggalt_examples.Rmd index efb7365..202a8a1 100644 --- a/vignettes/ggalt_examples.Rmd +++ b/vignettes/ggalt_examples.Rmd @@ -15,6 +15,7 @@ knitr::opts_chunk$set(collapse=TRUE, comment="##", fig.retina=1, fig.height=6, f library(ggplot2) library(gridExtra) library(ggalt) +library(scales) # current verison packageVersion("ggalt") @@ -132,19 +133,6 @@ m + stat_bkde2d(bandwidth=c(0.5, 4), aes(fill = ..level..), geom = "polygon") ``` -### `coord_proj` LIVES! (still needs a teensy bit of work) - -```{r coord_proj} -world <- map_data("world") -world <- world[world$region != "Antarctica",] - -gg <- ggplot() -gg <- gg + geom_cartogram(data=world, map=world, - aes(x=long, y=lat, map_id=region)) -gg <- gg + coord_proj("+proj=wintri") -gg -``` - ### ProPublica StateFace ```{r stateface} @@ -240,11 +228,7 @@ LBGTQ/Ally,0.79 Mixed Race,0.80 Jewish Heritage/Observance,0.85 International Students,0.87", stringsAsFactors=FALSE, sep=",", header=TRUE) - -library(ggplot2) -library(ggalt) -library(scales) - + gg <- ggplot(df, aes(y=reorder(category, pct), x=pct)) gg <- gg + geom_lollipop(point.colour="steelblue", point.size=2, horizontal=TRUE) gg <- gg + scale_x_continuous(expand=c(0,0), labels=percent, @@ -276,5 +260,6 @@ ggplot(df, aes(y=trt, x=l, xend=r)) + dot_guide=TRUE, dot_guide_size=0.25) + labs(x=NULL, y=NULL, title="ggplot2 geom_dumbbell with dot guide") + theme_minimal() + - theme(panel.grid.major.x=element_line(size=0.05)) + theme(panel.grid.major.x=element_line(size=0.05)) + + theme(panel.grid.major.y=element_blank()) ```