From ba5b40ce66845dfc98d2ad3ca66095b49ebb1961 Mon Sep 17 00:00:00 2001 From: hrbrmstr Date: Sat, 25 Aug 2018 18:14:50 -0400 Subject: [PATCH] initial commit/quick hack --- DESCRIPTION | 16 ++- NAMESPACE | 40 ++++++- R/geom_wtg.R | 153 ++++++++++++++++++++++++++ R/sysdata.rda | Bin 0 -> 4656 bytes R/utils.R | 56 ++++++++++ R/worldtilegrid-package.R | 28 ++++- README.Rmd | 49 ++++++++- README.md | 75 ++++++++++++- README_files/figure-gfm/unnamed-chunk-4-1.png | Bin 0 -> 44575 bytes data/wtg.rda | Bin 0 -> 4656 bytes man/geom_wtg.Rd | 83 ++++++++++++++ man/worldtilegrid.Rd | 8 +- man/wtg.Rd | 9 ++ 13 files changed, 502 insertions(+), 15 deletions(-) create mode 100644 R/geom_wtg.R create mode 100644 R/sysdata.rda create mode 100644 R/utils.R create mode 100644 README_files/figure-gfm/unnamed-chunk-4-1.png create mode 100644 data/wtg.rda create mode 100644 man/geom_wtg.Rd create mode 100644 man/wtg.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 0088f00..f8d6c9c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,24 +1,30 @@ Package: worldtilegrid Type: Package -Title: worldtilegrid title goes here otherwise CRAN checks fail +Title: A ggplot2 Geom for World Tile Grids Version: 0.1.0 Date: 2018-08-25 Authors@R: c( person("Bob", "Rudis", email = "bob@rud.is", role = c("aut", "cre"), - comment = c(ORCID = "0000-0001-5670-2640")) + comment = c(ORCID = "0000-0001-5670-2640")), + person("Maarten", "Lambrechts", role = "aut", + comment = "R WTG Data Creator"), + person("Jon", "Schwabish", role = "aut", comment = "Concept Originatior") ) Maintainer: Bob Rudis -Description: A good description goes here otherwise CRAN checks fail. +Description: A ggplot2 Geom for World Tile Grids URL: https://gitlab.com/hrbrmstr/worldtilegrid BugReports: https://gitlab.com/hrbrmstr/worldtilegrid/issues Encoding: UTF-8 License: AGPL Suggests: testthat, + viridis, + RColorBrewer, covr Depends: R (>= 3.2.0) Imports: - httr, - jsonlite + ggplot2, + grid, + scales RoxygenNote: 6.0.1.9000 diff --git a/NAMESPACE b/NAMESPACE index 5b4b9ae..bb20986 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,4 +1,40 @@ # Generated by roxygen2: do not edit by hand -import(httr) -importFrom(jsonlite,fromJSON) +export(GeomWtg) +export(geom_wtg) +export(wtg) +importFrom(ggplot2,"%+replace%") +importFrom(ggplot2,Geom) +importFrom(ggplot2,GeomRect) +importFrom(ggplot2,Stat) +importFrom(ggplot2,aes) +importFrom(ggplot2,aes_) +importFrom(ggplot2,aes_string) +importFrom(ggplot2,coord_equal) +importFrom(ggplot2,draw_key_polygon) +importFrom(ggplot2,element_blank) +importFrom(ggplot2,element_rect) +importFrom(ggplot2,element_text) +importFrom(ggplot2,geom_point) +importFrom(ggplot2,geom_text) +importFrom(ggplot2,geom_tile) +importFrom(ggplot2,ggplot) +importFrom(ggplot2,ggplotGrob) +importFrom(ggplot2,ggproto) +importFrom(ggplot2,ggtitle) +importFrom(ggplot2,guides) +importFrom(ggplot2,labs) +importFrom(ggplot2,layer) +importFrom(ggplot2,margin) +importFrom(ggplot2,rel) +importFrom(ggplot2,resolution) +importFrom(ggplot2,scale_color_manual) +importFrom(ggplot2,scale_fill_brewer) +importFrom(ggplot2,scale_fill_manual) +importFrom(ggplot2,scale_x_continuous) +importFrom(ggplot2,scale_y_continuous) +importFrom(ggplot2,scale_y_reverse) +importFrom(ggplot2,theme) +importFrom(ggplot2,theme_bw) +importFrom(grid,unit) +importFrom(scales,alpha) diff --git a/R/geom_wtg.R b/R/geom_wtg.R new file mode 100644 index 0000000..3d96728 --- /dev/null +++ b/R/geom_wtg.R @@ -0,0 +1,153 @@ +stat_wtg <- ggplot2::stat_identity +StatWtg <- ggplot2::StatIdentity + +#' World Tile Grid Geom +#' +#' Pass in a data frame of countries (iso2c, i23c, name) and a value column and +#' get back a world tile grid. +#' +#' **IMPORTANT** : For now, you need to pass in a _complete_ set of countries +#' (the values can be `NA`). When I get time I'll work on this limitation but +#' there's a [wtg] data frame exported from the package that you can use +#' to merge with your data to ensure you've got all the tiles. +#' +#' **ALSO** : Labeling world tile grids is a tricky business and no labeling +#' parameters are planned for this since you should think very carefully about +#' the tradeoffs of tiny text/numbers vs readability. These charts are really +#' only good for overviews in single-chart form or highlighting stark differences +#' in panel-form. +#' +#' \cr +#' There are two special/critical `aes()` mappings:\cr +#' \cr +#' - `country` (so the geom knows which column to map the country names/abbrevs to) +#' - `fill` (which column you're mapping the filling for the squares with) +#' +#' @md +#' @param mapping Set of aesthetic mappings created by `aes()` or +#' `aes_()`. If specified and `inherit.aes = TRUE` (the +#' default), it is combined with the default mapping at the top level of the +#' plot. You must supply `mapping` if there is no plot mapping. +#' @param data The data to be displayed in this layer. There are three +#' options: +#' +#' If `NULL`, the default, the data is inherited from the plot +#' data as specified in the call to `ggplot()`. +#' +#' A `data.frame`, or other object, will override the plot +#' data. All objects will be fortified to produce a data frame. See +#' `fortify()` for which variables will be created. +#' +#' A `function` will be called with a single argument, +#' the plot data. The return value must be a `data.frame.`, and +#' will be used as the layer data. +#' @param border_col border color of the state squares, default "`white`" +#' @param border_size thickness of the square state borders +#' @param na.rm If `FALSE`, the default, missing values are removed with +#' a warning. If `TRUE`, missing values are silently removed. +#' @param ... other arguments passed on to `layer()`. These are +#' often aesthetics, used to set an aesthetic to a fixed value, like +#' `color = "red"` or `size = 3`. They may also be parameters +#' to the paired geom/stat. +#' @param show.legend logical. Should this layer be included in the legends? +#' `NA`, the default, includes if any aesthetics are mapped. +#' `FALSE` never includes, and `TRUE` always includes. +#' It can also be a named logical vector to finely select the aesthetics to +#' display. +#' @param inherit.aes If `FALSE`, overrides the default aesthetics, +#' rather than combining with them. This is most useful for helper functions +#' that define both data and aesthetics and shouldn't inherit behaviour from +#' the default plot specification, e.g. `borders()`. +#' @export +geom_wtg <- function( + mapping = NULL, data = NULL, + border_col = "white", border_size = 0.125, + ..., + na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) { + + ggplot2::layer( + data = data, + mapping = mapping, + stat = "wtg", + geom = GeomWtg, + position = "identity", + show.legend = show.legend, + inherit.aes = inherit.aes, + params = list( + border_col = border_col, + border_size = border_size, + na.rm = na.rm, + ... + ) + ) + +} + +#' @rdname geom_wtg +#' @export +GeomWtg <- ggplot2::ggproto( + `_class` = "GeomWtg", + `_inherit` = ggplot2::Geom, + + default_aes = ggplot2::aes( + country = "country", + fill = NA, colour = NA, alpha = NA, + size = 0.1, linetype = 1, width = NA, height = NA + ), + + required_aes = c("country", "fill"), + + extra_params = c("na.rm", "width", "height"), + + setup_data = function(data, params) { + + country_data <- data.frame(data, stringsAsFactors=FALSE) + + if (max(nchar(country_data[["country"]])) == 3) { + merge.x <- "alpha.3" + } else if (max(nchar(country_data[["country"]])) == 2) { + merge.x <- "alpha.2" + } else { + merge.x <- "name" + } + + country_data <- validate_countries(country_data, "country", merge.x, ignore_dups=TRUE) + + merge( + wtg, country_data, by.x=merge.x, by.y="country", all.x=TRUE, sort=TRUE + ) -> wtg.dat + + wtg.dat$country <- wtg.dat[[merge.x]] + + wtg.dat$width <- wtg.dat$width %||% params$width %||% ggplot2::resolution(wtg.dat$x, FALSE) + wtg.dat$height <- wtg.dat$height %||% params$height %||% ggplot2::resolution(wtg.dat$y, FALSE) + + transform(wtg.dat, + xmin = x - width / 2, xmax = x + width / 2, width = NULL, + ymin = y - height / 2, ymax = y + height / 2, height = NULL + ) -> xdat + + xdat + + }, + + draw_panel = function(self, data, panel_params, coord, + border_col = "white", border_size = 0.125) { + + tile_data <- data + tile_data$size <- border_size + tile_data$colour <- border_col + + coord <- ggplot2::coord_equal() + + grid::gList( + GeomTile$draw_panel(tile_data, panel_params, coord) + ) -> grobs + + ggname("geom_wtg", grid::grobTree(children = grobs)) + + }, + + draw_key = ggplot2::draw_key_polygon + +) diff --git a/R/sysdata.rda b/R/sysdata.rda new file mode 100644 index 0000000000000000000000000000000000000000..7200fcfef007157f4d126f92d98355a68d25a19c GIT binary patch literal 4656 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 literal 0 HcmV?d00001 diff --git a/R/utils.R b/R/utils.R new file mode 100644 index 0000000..c37036d --- /dev/null +++ b/R/utils.R @@ -0,0 +1,56 @@ +# Name ggplot grid object +# Convenience function to name grid objects +# +# @keyword internal +ggname <- function(prefix, grob) { + grob$name <- grid::grobName(grob, prefix) + grob +} + + +.sb_invert <- function(hex_color, dark_color="black", light_color="white", + na_color="white") { + + hex_color <- gsub("#", "", hex_color) + + R <- suppressWarnings(as.integer(paste("0x", substr(hex_color,1,2), sep=""))) + G <- suppressWarnings(as.integer(paste("0x", substr(hex_color,3,4), sep=""))) + B <- suppressWarnings(as.integer(paste("0x", substr(hex_color,5,6), sep=""))) + + YIQ <- ((R*299) + (G*587) + (B*114)) / 1000 + + return( + ifelse(is.na(YIQ), na_color, + ifelse( + YIQ >= 128, dark_color, light_color) + ) + ) +} + +# sanity checks for country values +validate_countries <- function(country_data, country_col, merge.x, ignore_dups=FALSE) { + + good_ccs <- country_data[[country_col]] %in% wtg[[merge.x]] + + if (any(!good_ccs)) { + invalid <- country_data[[country_col]][which(!good_ccs)] + country_data <- country_data[which(good_ccs),] + warning(sprintf("Found invalid country values: %s", paste0(invalid, collapse=", "))) + } + + if (!ignore_dups) { + dups <- duplicated(country_data[,country_col]) + if (any(dups)) { + country_data <- country_data[which(!dups),] + warning("Removing duplicate country rows") + } + } + + return(country_data) + +} + + +"%||%" <- function(a, b) { if (!is.null(a)) a else b } + +.pt <- 2.84527559055118 \ No newline at end of file diff --git a/R/worldtilegrid-package.R b/R/worldtilegrid-package.R index 1c6e2f5..31b8d1c 100644 --- a/R/worldtilegrid-package.R +++ b/R/worldtilegrid-package.R @@ -1,12 +1,30 @@ -#' ... -#' +#' A ggplot2 Geom for World Tile Grids +#' +#' - Ref: +#' - Ref: +# #' - URL: #' - BugReports: -#' +#' #' @md #' @name worldtilegrid #' @docType package #' @author Bob Rudis (bob@@rud.is) -#' @import httr -#' @importFrom jsonlite fromJSON +#' @author Maarten Lambrechts +#' @author Jon Schwabish +#' @importFrom grid unit +#' @importFrom scales alpha +#' @importFrom ggplot2 ggplot geom_tile scale_fill_manual guides geom_tile ggplotGrob +#' @importFrom ggplot2 geom_point geom_text scale_color_manual guides theme labs +#' @importFrom ggplot2 scale_x_continuous scale_y_continuous coord_equal theme_bw +#' @importFrom ggplot2 aes element_rect element_blank element_text resolution +#' @importFrom ggplot2 aes_string aes_ scale_y_reverse layer GeomRect margin %+replace% +#' @importFrom ggplot2 scale_fill_brewer ggtitle rel ggproto draw_key_polygon Geom Stat NULL + + +#' @title World Tile Grid Basemap Data +#' @docType data +#' @name wtg +#' @export +NULL \ No newline at end of file diff --git a/README.Rmd b/README.Rmd index f58b577..3da58d4 100644 --- a/README.Rmd +++ b/README.Rmd @@ -2,14 +2,25 @@ output: rmarkdown::github_document --- -# worldtilegrid +# worldtilegrid [WIP] + +A ggplot2 Geom for World Tile Grids ## Description +- Ref: +- Ref: + ## What's Inside The Tin The following functions are implemented: +- `geom_wtg`: World Tile Grid Geom + +The following _data_ is included/exported: + +`wtg`: World Tile Grid Basemap Data + ## Installation ```{r eval=FALSE} @@ -30,3 +41,39 @@ packageVersion("worldtilegrid") ``` + +### Example + +```{r message=FALSE, warning=FALSE, error=FALSE, fig.width=10, fig.height=6} +library(worldtilegrid) +library(tidyverse) + +set.seed(1) +data_frame( + ctry = worldtilegrid::wtg$alpha.3, + `Thing Val` = sample(1000, length(ctry)), + grp = 'Thing One' +) -> xdf1 + +data_frame( + ctry = worldtilegrid::wtg$alpha.3, + `Thing Val` = sample(1000, length(ctry)), + grp = 'Thing Two' +) -> xdf2 + +bind_rows( + xdf1, + xdf2 +) -> xdf + +ggplot(xdf, aes(country = ctry, fill = `Thing Val`)) + + geom_wtg() + + coord_equal() + + facet_wrap(~grp) + + viridis::scale_fill_viridis() + + labs(title = "World Tile Grid Facets") + + hrbrthemes::theme_ft_rc(grid="") + + theme(panel.border = element_rect(color=hrbrthemes::ft_cols$white, fill="#00000000")) + + theme(axis.text = element_blank()) + + theme(legend.position = "bottom") +``` \ No newline at end of file diff --git a/README.md b/README.md index 1671a41..e905499 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,75 @@ -# worldtilegrid +# worldtilegrid \[WIP\] + +A ggplot2 Geom for World Tile Grids + +## Description + + - Ref: + - Ref: + + +## What’s Inside The Tin + +The following functions are implemented: + + - `geom_wtg`: World Tile Grid Geom + +The following *data* is included/exported: + +`wtg`: World Tile Grid Basemap Data + +## Installation + +``` r +devtools::install_github("hrbrmstr/worldtilegrid") +``` + +## Usage + +``` r +library(worldtilegrid) + +# current verison +packageVersion("worldtilegrid") +``` + + ## [1] '0.1.0' + +### Example + +``` r +library(worldtilegrid) +library(tidyverse) + +set.seed(1) +data_frame( + ctry = worldtilegrid::wtg$alpha.3, + `Thing Val` = sample(1000, length(ctry)), + grp = 'Thing One' +) -> xdf1 + +data_frame( + ctry = worldtilegrid::wtg$alpha.3, + `Thing Val` = sample(1000, length(ctry)), + grp = 'Thing Two' +) -> xdf2 + +bind_rows( + xdf1, + xdf2 +) -> xdf + +ggplot(xdf, aes(country = ctry, fill = `Thing Val`)) + + geom_wtg() + + coord_equal() + + facet_wrap(~grp) + + viridis::scale_fill_viridis() + + labs(title = "World Tile Grid Facets") + + hrbrthemes::theme_ft_rc(grid="") + + theme(panel.border = element_rect(color=hrbrthemes::ft_cols$white, fill="#00000000")) + + theme(axis.text = element_blank()) + + theme(legend.position = "bottom") +``` + +![](README_files/figure-gfm/unnamed-chunk-4-1.png) diff --git a/README_files/figure-gfm/unnamed-chunk-4-1.png b/README_files/figure-gfm/unnamed-chunk-4-1.png new file mode 100644 index 0000000000000000000000000000000000000000..65103b71731a604b212d8264e2916884ae523802 GIT binary patch literal 44575 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 literal 0 HcmV?d00001 diff --git a/man/geom_wtg.Rd b/man/geom_wtg.Rd new file mode 100644 index 0000000..732c427 --- /dev/null +++ b/man/geom_wtg.Rd @@ -0,0 +1,83 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/geom_wtg.R +\docType{data} +\name{geom_wtg} +\alias{geom_wtg} +\alias{GeomWtg} +\title{World Tile Grid Geom} +\format{An object of class \code{GeomWtg} (inherits from \code{Geom}, \code{ggproto}, \code{gg}) of length 7.} +\usage{ +geom_wtg(mapping = NULL, data = NULL, border_col = "white", + border_size = 0.125, ..., na.rm = FALSE, show.legend = NA, + inherit.aes = TRUE) + +GeomWtg +} +\arguments{ +\item{mapping}{Set of aesthetic mappings created by \code{aes()} or +\code{aes_()}. If specified and \code{inherit.aes = TRUE} (the +default), it is combined with the default mapping at the top level of the +plot. You must supply \code{mapping} if there is no plot mapping.} + +\item{data}{The data to be displayed in this layer. There are three +options: + +If \code{NULL}, the default, the data is inherited from the plot +data as specified in the call to \code{ggplot()}. + +A \code{data.frame}, or other object, will override the plot +data. All objects will be fortified to produce a data frame. See +\code{fortify()} for which variables will be created. + +A \code{function} will be called with a single argument, +the plot data. The return value must be a \code{data.frame.}, and +will be used as the layer data.} + +\item{border_col}{border color of the state squares, default "\code{white}"} + +\item{border_size}{thickness of the square state borders} + +\item{...}{other arguments passed on to \code{layer()}. These are +often aesthetics, used to set an aesthetic to a fixed value, like +\code{color = "red"} or \code{size = 3}. They may also be parameters +to the paired geom/stat.} + +\item{na.rm}{If \code{FALSE}, the default, missing values are removed with +a warning. If \code{TRUE}, missing values are silently removed.} + +\item{show.legend}{logical. Should this layer be included in the legends? +\code{NA}, the default, includes if any aesthetics are mapped. +\code{FALSE} never includes, and \code{TRUE} always includes. +It can also be a named logical vector to finely select the aesthetics to +display.} + +\item{inherit.aes}{If \code{FALSE}, overrides the default aesthetics, +rather than combining with them. This is most useful for helper functions +that define both data and aesthetics and shouldn't inherit behaviour from +the default plot specification, e.g. \code{borders()}.} +} +\description{ +Pass in a data frame of countries (iso2c, i23c, name) and a value column and +get back a world tile grid. +} +\details{ +\strong{IMPORTANT} : For now, you need to pass in a \emph{complete} set of countries +(the values can be \code{NA}). When I get time I'll work on this limitation but +there's a \link{wtg} data frame exported from the package that you can use +to merge with your data to ensure you've got all the tiles. + +\strong{ALSO} : Labeling world tile grids is a tricky business and no labeling +parameters are planned for this since you should think very carefully about +the tradeoffs of tiny text/numbers vs readability. These charts are really +only good for overviews in single-chart form or highlighting stark differences +in panel-form. + +\cr +There are two special/critical \code{aes()} mappings:\cr +\cr +\itemize{ +\item \code{country} (so the geom knows which column to map the country names/abbrevs to) +\item \code{fill} (which column you're mapping the filling for the squares with) +} +} +\keyword{datasets} diff --git a/man/worldtilegrid.Rd b/man/worldtilegrid.Rd index 9a0d9cb..99d5fcf 100644 --- a/man/worldtilegrid.Rd +++ b/man/worldtilegrid.Rd @@ -4,13 +4,19 @@ \name{worldtilegrid} \alias{worldtilegrid} \alias{worldtilegrid-package} -\title{...} +\title{A ggplot2 Geom for World Tile Grids} \description{ \itemize{ +\item Ref: \url{https://policyviz.com/2017/10/12/the-world-tile-grid-map/} +\item Ref: \url{http://www.maartenlambrechts.com/2017/10/22/tutorial-a-worldtilegrid-with-ggplot2.html} \item URL: \url{https://gitlab.com/hrbrmstr/worldtilegrid} \item BugReports: \url{https://gitlab.com/hrbrmstr/worldtilegrid/issues} } } \author{ Bob Rudis (bob@rud.is) + +Maarten Lambrechts + +Jon Schwabish } diff --git a/man/wtg.Rd b/man/wtg.Rd new file mode 100644 index 0000000..66d9b3e --- /dev/null +++ b/man/wtg.Rd @@ -0,0 +1,9 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/worldtilegrid-package.R +\docType{data} +\name{wtg} +\alias{wtg} +\title{World Tile Grid Basemap Data} +\description{ +World Tile Grid Basemap Data +}