From 191c3ce07df48181af6cfd4caaf44a6806a20899 Mon Sep 17 00:00:00 2001 From: Bob Rudis Date: Sun, 20 Mar 2016 17:15:43 -0400 Subject: [PATCH] geom_stateface --- DESCRIPTION | 29 ++++--- NAMESPACE | 9 +++ R/ggalt-package.r | 6 +- R/pokemon.r | 16 ++-- R/stateface.r | 133 +++++++++++++++++++++++++++++++ R/zzz.r | 11 +++ inst/fonts/stateface-regular-webfont.ttf | Bin 0 -> 27096 bytes man/geom_bkde.Rd | 34 ++++---- man/geom_bkde2d.Rd | 34 ++++---- man/geom_stateface.Rd | 67 ++++++++++++++++ man/geom_xspline.Rd | 34 ++++---- man/ggalt-ggproto.Rd | 3 +- man/ggalt.Rd | 3 +- man/list_avatars.Rd | 9 ++- man/load_stateface.Rd | 12 +++ man/pokemon_pal.Rd | 8 +- man/scale_pokemon.Rd | 7 +- man/show_stateface.Rd | 14 ++++ man/stat_ash.Rd | 34 ++++---- 19 files changed, 375 insertions(+), 88 deletions(-) create mode 100644 R/stateface.r create mode 100644 R/zzz.r create mode 100755 inst/fonts/stateface-regular-webfont.ttf create mode 100644 man/geom_stateface.Rd create mode 100644 man/load_stateface.Rd create mode 100644 man/show_stateface.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 5263091..d1d21a6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,24 +1,30 @@ Package: ggalt -Title: Extra Coordinate Systems, 'Geoms', Statistical Transformations and Scales for 'ggplot2' -Version: 0.1.5.9000 -Authors@R: c(person("Bob", "Rudis", email = "bob@rudis.net", role = c("aut", "cre"))) -Description: A compendium of 'geoms', 'coords', 'stats' & scales for 'ggplot2', - including splines, 1d and 2d densities, univariate average shifted histograms - and a new map coordinate system based on the 'PROJ.4'-library. -Depends: - R (>= 3.0.0), - ggplot2 (>= 2.0.0) +Title: Extra Coordinate Systems, 'Geoms', Statistical Transformations, Scales and + Fonts for 'ggplot2' +Version: 0.2.0.9000 +Authors@R: c( + person("Bob", "Rudis", email = "bob@rudis.net", role = c("aut", "cre")), + 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 and the 'StateFace' + open source font 'ProPublica'. License: AGPL + file LICENSE LazyData: true URL: https://github.com/hrbrmstr/ggalt BugReports: https://github.com/hrbrmstr/ggalt/issues +Encoding: UTF-8 +Depends: + R (>= 3.0.0), + ggplot2 (>= 2.0.0) Suggests: testthat, gridExtra, knitr, rmarkdown, ggthemes, -Encoding: UTF-8 Imports: graphics, grDevices, @@ -31,6 +37,7 @@ Imports: gtable, ash, maps, - MASS + MASS, + extrafont RoxygenNote: 5.0.1 VignetteBuilder: knitr diff --git a/NAMESPACE b/NAMESPACE index 1af8200..d854bc1 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -8,6 +8,7 @@ S3method(grobY,absoluteGrob) export(CoordProj) export(GeomBkde) export(GeomBkde2d) +export(GeomStateface) export(GeomXspline) export(StatAsh) export(StatBkde) @@ -16,12 +17,15 @@ export(StatXspline) export(coord_proj) export(geom_bkde) export(geom_bkde2d) +export(geom_stateface) export(geom_xspline) export(list_avatars) +export(load_stateface) export(pokemon_pal) export(scale_color_pokemon) export(scale_colour_pokemon) export(scale_fill_pokemon) +export(show_stateface) export(stat_ash) export(stat_bkde) export(stat_bkde2d) @@ -36,8 +40,12 @@ import(maps) import(proj4) importFrom(RColorBrewer,brewer.pal) importFrom(dplyr,filter) +importFrom(extrafont,fonts) +importFrom(extrafont,loadfonts) +importFrom(extrafont,ttf_import) importFrom(grid,gList) importFrom(grid,gTree) +importFrom(grid,gpar) importFrom(grid,grid.draw) importFrom(grid,grobHeight) importFrom(grid,grobName) @@ -45,6 +53,7 @@ importFrom(grid,grobTree) importFrom(grid,grobWidth) importFrom(grid,grobX) importFrom(grid,grobY) +importFrom(grid,textGrob) importFrom(grid,unit.c) importFrom(grid,viewport) importFrom(gtable,gtable_col) diff --git a/R/ggalt-package.r b/R/ggalt-package.r index 755ac86..f805767 100644 --- a/R/ggalt-package.r +++ b/R/ggalt-package.r @@ -1,6 +1,7 @@ #' Extra Geoms, Stats and Coords for 'ggplot2' #' -#' A package containing additional geoms, coords and stats for the ggplot2 2.0+ +#' A package containing additional geoms, coords, stats, scales & fonts +#' for ggplot2 2.0+ #' #' @name ggalt #' @docType package @@ -9,7 +10,8 @@ #' @importFrom dplyr filter #' @importFrom scales rescale expand_range #' @importFrom grid grobName grobTree unit.c grobHeight grobWidth viewport -#' grid.draw grobX grobY gTree gList +#' grid.draw grobX grobY gTree gList textGrob gpar #' @importFrom gtable gtable_col gtable_height gtable_width gtable_row gtable_col #' @importFrom RColorBrewer brewer.pal +#' @importFrom extrafont loadfonts fonts ttf_import NULL diff --git a/R/pokemon.r b/R/pokemon.r index 8ee0c2c..4e30a38 100644 --- a/R/pokemon.r +++ b/R/pokemon.r @@ -2,8 +2,8 @@ #' #' Color scales using the colors in the Pokemon characters #' -#' Data taken from the hard work by the \href{http://www.pokegraphs.com/}{folks here}. -#' +#' @references \href{http://www.pokegraphs.com/}{Original JSON color list}. +#' @note Pokémon & Pokémon character names are trademarks of Nintendo. #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams pokemon_pal #' @family colour pokemon @@ -23,11 +23,10 @@ scale_fill_pokemon <- function(avatar=FALSE, ...) { discrete_scale("fill", "pokemon", pokemon_pal(avatar=avatar), ...) } - #' Pick a Pokemon palette #' -#' Data taken from the hard work by the \href{http://www.pokegraphs.com/}{folks here}. -#' +#' @references \href{http://www.pokegraphs.com/}{Original JSON color list}. +#' @note Pokémon & Pokémon character names are trademarks of Nintendo. #' @param avatar avatar name. Use \code{list_avatars()} to see them all! #' @export pokemon_pal <- function(avatar="bulbasaur") { @@ -51,9 +50,10 @@ pokemon_pal <- function(avatar="bulbasaur") { #' List Pokemon avatar names #' -#' Data taken from the hard work by the \href{http://www.pokegraphs.com/}{folks here}. -#' -#' @note Warning: huge! list +#' @references \href{http://www.pokegraphs.com/}{Original JSON color list}. +#' @note Warning: huge! list\cr +#' \cr +#' Pokémon & Pokémon character names are trademarks of Nintendo. #' @export list_avatars <- function() { sort(names(pokemon)) diff --git a/R/stateface.r b/R/stateface.r new file mode 100644 index 0000000..e38bd74 --- /dev/null +++ b/R/stateface.r @@ -0,0 +1,133 @@ +state_trans <- c(AL='B', AK='A', AZ='D', AR='C', CA='E', CO='F', CT='G', + DE='H', DC='y', FL='I', GA='J', HI='K', ID='M', IL='N', + IN='O', IA='L', KS='P', KY='Q', LA='R', ME='U', MD='T', + MA='S', MI='V', MN='W', MS='Y', MO='X', MT='Z', NE='c', + NV='g', NH='d', NJ='e', NM='f', NY='h', NC='a', ND='b', + OH='i', OK='j', OR='k', PA='l', RI='m', SC='n', SD='o', + TN='p', TX='q', UT='r', VT='t', VA='s', WA='u', WV='w', + WI='v', WY='x', US='z') + +state_tbl <- setNames(toupper(state.abb), tolower(state.name)) + +#' Show location of StateFace font +#' +#' Displays the path to the StateFace font. For the font to work +#' in the on-screen plot device for ggplot2, you need to install +#' the font on your system +#' @export +show_stateface <- function() { + system.file("fonts/", package="ggalt") +} + +#' Load stateface font +#' +#' @export +load_stateface <- function() { + if (!any(grepl("StateFace", extrafont::fonts()))) { + tmp <- capture.output(suppressWarnings(extrafont::ttf_import( + system.file("fonts/", package="ggalt"), + prompt=FALSE, pattern="*.ttf", recursive=FALSE))) + } + tmp <- capture.output(suppressWarnings(extrafont::loadfonts(quiet=TRUE))) +} + +#' Use ProPublica's StateFace font in ggplot2 plots +#' +#' @inheritParams ggplot2::geom_text +#' @export +geom_stateface <- function(mapping = NULL, data = NULL, stat = "identity", + position = "identity", ..., parse = FALSE, + nudge_x = 0, nudge_y = 0, check_overlap = FALSE, + na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) { + + if (!missing(nudge_x) || !missing(nudge_y)) { + if (!missing(position)) { + stop("Specify either `position` or `nudge_x`/`nudge_y`", call. = FALSE) + } + + position <- position_nudge(nudge_x, nudge_y) + } + + layer( + data = data, + mapping = mapping, + stat = stat, + geom = GeomStateface, + position = position, + show.legend = show.legend, + inherit.aes = inherit.aes, + params = list( + parse = parse, + check_overlap = check_overlap, + na.rm = na.rm, + ... + ) + ) + +} + +#' @rdname ggalt-ggproto +#' @format NULL +#' @usage NULL +#' @export +GeomStateface <- ggproto("GeomStateface", Geom, + required_aes = c("x", "y", "label"), + + default_aes = aes( + colour = "black", size = 3.88, angle = 0, hjust = 0.5, + vjust = 0.5, alpha = NA, family = "", fontface = 1, lineheight = 1.2 + ), + + draw_panel = function(data, panel_scales, coord, parse = FALSE, + na.rm = FALSE, check_overlap = FALSE) { + lab <- data$label + + if (max(sapply(lab, nchar)) == 2) { + lab <- unname(state_trans[toupper(lab)]) + } else { + lab <- unname(state_trans[state_tbl[tolower(lab)]]) + } + + data <- coord$transform(data, panel_scales) + if (is.character(data$vjust)) { + data$vjust <- compute_just(data$vjust, data$y) + } + if (is.character(data$hjust)) { + data$hjust <- compute_just(data$hjust, data$x) + } + + textGrob( + lab, + data$x, data$y, default.units = "native", + hjust = data$hjust, vjust = data$vjust, + rot = data$angle, + gp = gpar( + col = alpha(data$colour, data$alpha), + fontsize = data$size * .pt, + fontfamily = "StateFace", + fontface = data$fontface, + lineheight = data$lineheight + ), + check.overlap = check_overlap + ) + }, + + draw_key = draw_key_text +) + +compute_just <- function(just, x) { + inward <- just == "inward" + just[inward] <- c("left", "middle", "right")[just_dir(x[inward])] + outward <- just == "outward" + just[outward] <- c("right", "middle", "left")[just_dir(x[outward])] + + unname(c(left = 0, center = 0.5, right = 1, + bottom = 0, middle = 0.5, top = 1)[just]) +} + +just_dir <- function(x, tol = 0.001) { + out <- rep(2L, length(x)) + out[x < 0.5 - tol] <- 1L + out[x > 0.5 + tol] <- 3L + out +} diff --git a/R/zzz.r b/R/zzz.r new file mode 100644 index 0000000..7961a08 --- /dev/null +++ b/R/zzz.r @@ -0,0 +1,11 @@ +.onAttach <- function(...) { + + if (!interactive()) return() + + load_stateface() + + packageStartupMessage(paste0("ggalt is under *active* development. ", + "See https://github.com/hrbrmstr/ggalt for changes")) + +} + diff --git a/inst/fonts/stateface-regular-webfont.ttf b/inst/fonts/stateface-regular-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..e873d8ced76ca2814272bd87f0fcb05c59d8687c GIT binary patch literal 27096 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