Browse Source

geom_statebins()

master
boB Rudis 6 years ago
parent
commit
0895297ec9
No known key found for this signature in database GPG Key ID: 1D7529BE14E2BBA9
  1. 3
      DESCRIPTION
  2. 2
      NAMESPACE
  3. 1
      NEWS.md
  4. 4
      R/aaa.R
  5. 145
      R/geom-statebins.r
  6. 3
      R/theme-statebin.R
  7. 4
      R/util.R
  8. 21
      README.Rmd
  9. 25
      README.md
  10. BIN
      README_files/figure-gfm/sb_facet-1.png
  11. 59
      man/geom_statebins.Rd

3
DESCRIPTION

@ -1,7 +1,7 @@
Package: statebins
Type: Package
Title: Create 'U.S.' Uniform Square State Cartogram Heatmaps
Version: 1.3.1
Version: 2.0.0
Date: 2017-11-14
Authors@R: c(
person("Bob", "Rudis", email = "bob@rud.is", role = c("aut", "cre"),
@ -36,6 +36,7 @@ Collate:
'aaa.R'
'geom-rrect.r'
'geom-rtile.R'
'geom-statebins.r'
'gutil.R'
'statebins-package.R'
'statebins.R'

2
NAMESPACE

@ -1,5 +1,7 @@
# Generated by roxygen2: do not edit by hand
export(GeomStatebins)
export(geom_statebins)
export(statebins)
export(theme_statebins)
importFrom(ggplot2,Geom)

1
NEWS.md

@ -2,6 +2,7 @@
* Added support for `VI`/`Virgin Islands`
* Supports auto-computation of when to use light & dark label colors
* New `theme_statebins()`
* New `geom_statebins()`
* Rounded rectangle support (with user-defined corner radius)!
* Completely re-designed the interface and will not be providing backwards-compatibility.

4
R/aaa.R

@ -28,3 +28,7 @@ state_coords <- structure(list(abbrev = c("AL", "AK", "AZ", "AR", "CA", "CO",
class = "data.frame", row.names = c(NA, -54L))
state_coords <- state_coords[order(state_coords$state),]
b_state_coords <- state_coords
colnames(b_state_coords) <- c("abbrev", "state", "x", "y")
b_state_coords$y <- -b_state_coords$y

145
R/geom-statebins.r

@ -0,0 +1,145 @@
#' A statebins Geom (WIP!)
#'
#' WIP!!!!!!!!!!! Full geom documentation coming soon. See Details and the Examples for now.
#'
#' For now, you pass in:
#'
#' - `border_col` (border color of the state squares, default "`white`")
#' - `border_size` (thickness of the square state borders)
#' - `lbl_size` (the relative font size of the state label text, default `3`)
#' - `dark_lbl` (the color for the state label text when it shld be dark text on light background)
#' - `light_lbl` (the color for the state label text when it shld be light text on dark background)
#' - `radius` (corner radius --- `0` for a "square")
#'
#' You also need to (ok, _should_) pass in two `aes()` mappings:
#'
#' - `state` (so the geom knows which column to map the state names/abbrevs to)
#' - `fill` (which column you're mapping the filling for the squares with)
#'
#' @md
#' @export
#' @examples \dontrun{
#' library(statebins)
#' library(cdcfluview)
#' library(hrbrthemes)
#' library(tidyverse)
#'
#' flu <- ili_weekly_activity_indicators(2017)
#'
#' ggplot(flu, aes(state=statename, fill=activity_level)) +
#' geom_statebins() +
#' coord_equal() +
#' viridis::scale_fill_viridis(
#' name = "ILI Activity Level ", limits=c(0,10), breaks=0:10, option = "magma", direction = -1
#' ) +
#' facet_wrap(~weekend) +
#' labs(title="2017-18 Flu Season ILI Activity Level") +
#' theme_statebins(base_family = font_ps) +
#' theme(plot.title=element_text(size=16, hjust=0)) +
#' theme(plot.margin = margin(30,30,30,30))
#' }
geom_statebins <- function(
mapping = NULL, data = NULL,
border_col = "white", border_size = 2,
lbl_size = 3, dark_lbl = "black", light_lbl = "white",
radius = grid::unit(6, "pt"),
...,
na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) {
ggplot2::layer(
data = data,
mapping = mapping,
stat = "identity",
geom = GeomStatebins,
position = "identity",
show.legend = show.legend,
inherit.aes = inherit.aes,
params = list(
border_col = border_col,
border_size = border_size,
lbl_size = lbl_size,
dark_lbl = dark_lbl,
light_lbl = light_lbl,
radius = radius,
na.rm = na.rm,
...
)
)
}
#' @rdname geom_statebins
#' @export
GeomStatebins <- ggplot2::ggproto("GeomStatebins", ggplot2::Geom,
default_aes = ggplot2::aes(
fill = "grey20", colour = NA, size = 0.1, linetype = 1,
state = "state", label="abbrev", angle = 0, hjust = 0.5,
vjust = 0.5, alpha = NA, family = "", fontface = 1, lineheight = 1.2
),
extra_params = c("na.rm", "width", "height"),
setup_data = function(data, params) {
# message("setup_data()")
# saveRDS(data, "/tmp/data.rds")
state_data <- data.frame(data, stringsAsFactors=FALSE)
if (max(nchar(state_data[,"state"])) <= 3) {
merge.x <- "abbrev"
} else {
merge.x <- "state"
}
state_data <- validate_states(state_data, "state", merge.x, ignore_dups=TRUE)
st.dat <- merge(b_state_coords, state_data,
by.x=merge.x, by.y="state", all.y=TRUE, sort=TRUE)
st.dat$width <- st.dat$width %||% params$width %||% ggplot2::resolution(st.dat$x, FALSE)
st.dat$height <- st.dat$height %||% params$height %||% ggplot2::resolution(st.dat$y, FALSE)
transform(st.dat,
xmin = x - width / 2, xmax = x + width / 2, width = NULL,
ymin = y - height / 2, ymax = y + height / 2, height = NULL
) -> xdat
saveRDS(xdat, "/tmp/setupdata.rds")
xdat
},
required_aes = c("state", "fill"),
draw_panel = function(self, data, panel_params, coord,
border_col = "white", border_size = 2,
lbl_size = 3, dark_lbl = "black", light_lbl = "white",
radius = grid::unit(6, "pt")) {
tile_data <- data
tile_data$size <- 2
tile_data$colour <- border_col
tile_data$size <- border_size
text_data <- data
text_data$label <- data$abbrev
text_data$fill <- NA
text_data$size <- lbl_size
text_data$colour <- .sb_invert(data$fill, dark_lbl, light_lbl)
coord <- coord_equal()
grid::gList(
GeomRtile$draw_panel(tile_data, panel_params, coord, radius),
ggplot2::GeomText$draw_panel(text_data, panel_params, coord)
) -> grobs
ggname("geom_statebins", grid::grobTree(children = grobs))
},
draw_key = ggplot2::draw_key_polygon
)

3
R/theme-statebin.R

@ -10,9 +10,11 @@ theme_statebins <- function(legend_position="bottom",
base_size = 11, base_family = "",
base_line_size = base_size/22,
base_rect_size = base_size/22) {
gg <- theme_bw(base_family = base_family, base_size = base_size,
base_line_size = base_line_size, base_rect_size = base_rect_size)
gg <- gg + theme(panel.border=element_blank())
gg <- gg + theme(strip.background = element_rect(color="#2b2b2b", fill="white"))
gg <- gg + theme(panel.grid=element_blank())
gg <- gg + theme(panel.background=element_blank())
gg <- gg + theme(axis.ticks=element_blank())
@ -21,4 +23,5 @@ theme_statebins <- function(legend_position="bottom",
gg <- gg + theme(axis.title.x=element_text(hjust=0.5))
gg <- gg + theme(legend.position=legend_position)
gg
}

4
R/util.R

@ -13,7 +13,7 @@
}
# sanity checks for state values
validate_states <- function(state_data, state_col, merge.x) {
validate_states <- function(state_data, state_col, merge.x, ignore_dups=FALSE) {
good_states <- state_data[,state_col] %in% state_coords[,merge.x]
if (any(!good_states)) {
@ -22,11 +22,13 @@ validate_states <- function(state_data, state_col, merge.x) {
warning("Found invalid state values: ", invalid)
}
if (!ignore_dups) {
dups <- duplicated(state_data[,state_col])
if (any(dups)) {
state_data <- state_data[which(!dups),]
warning("Removing duplicate state rows")
}
}
return(state_data)

21
README.Rmd

@ -17,6 +17,7 @@ Create 'U.S.' Uniform Square State Cartogram Heatmaps
The following functions are implemented:
- `statebins`: Creates "statebin" charts in the style of http://bit.ly/statebins
- `geom_statebins`: A statebins Geom (WIP!)
- `theme_statebins`: Base statebins theme
## Installation
@ -35,6 +36,8 @@ All of the following examples use the [WaPo data](http://www.washingtonpost.com/
```{r setup}
library(statebins)
library(cdcfluview)
library(hrbrthemes)
library(tidyverse)
# current verison
@ -136,6 +139,24 @@ statebins(USArrests, value_col="Assault", name = "Assault", round=TRUE,
theme_statebins(legend_position="right")
```
### Geom
```{r sb_facet, fig.width=17, fig.height=10}
flu <- ili_weekly_activity_indicators(2017)
ggplot(flu, aes(state=statename, fill=activity_level)) +
geom_statebins() +
coord_equal() +
viridis::scale_fill_viridis(
name = "ILI Activity Level ", limits=c(0,10), breaks=0:10, option = "magma", direction = -1
) +
facet_wrap(~weekend) +
labs(title="2017-18 Flu Season ILI Activity Level") +
theme_statebins(base_family = font_ps) +
theme(plot.title=element_text(size=16, hjust=0)) +
theme(plot.margin = margin(30,30,30,30))
```
### All the "states"
`statebins` now has PR, VI & NYC (by name or abbreviation) so you can use them, too:

25
README.md

@ -9,6 +9,7 @@ The following functions are implemented:
- `statebins`: Creates “statebin” charts in the style of
<http://bit.ly/statebins>
- `geom_statebins`: A statebins Geom (WIP\!)
- `theme_statebins`: Base statebins theme
## Installation
@ -34,13 +35,15 @@ output (including the non-annotated legend).
``` r
library(statebins)
library(cdcfluview)
library(hrbrthemes)
library(tidyverse)
# current verison
packageVersion("statebins")
```
## [1] '1.3.1'
## [1] '2.0.0'
### The original wapo data
@ -153,6 +156,26 @@ statebins(USArrests, value_col="Assault", name = "Assault", round=TRUE,
<img src="README_files/figure-gfm/rounded2-1.png" width="672" />
### Geom
``` r
flu <- ili_weekly_activity_indicators(2017)
ggplot(flu, aes(state=statename, fill=activity_level)) +
geom_statebins() +
coord_equal() +
viridis::scale_fill_viridis(
name = "ILI Activity Level ", limits=c(0,10), breaks=0:10, option = "magma", direction = -1
) +
facet_wrap(~weekend) +
labs(title="2017-18 Flu Season ILI Activity Level") +
theme_statebins(base_family = font_ps) +
theme(plot.title=element_text(size=16, hjust=0)) +
theme(plot.margin = margin(30,30,30,30))
```
<img src="README_files/figure-gfm/sb_facet-1.png" width="1632" />
### All the “states”
`statebins` now has PR, VI & NYC (by name or abbreviation) so you can

BIN
README_files/figure-gfm/sb_facet-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

59
man/geom_statebins.Rd

@ -0,0 +1,59 @@
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/geom-statebins.r
\docType{data}
\name{geom_statebins}
\alias{geom_statebins}
\alias{GeomStatebins}
\title{A statebins Geom (WIP!)}
\format{An object of class \code{GeomStatebins} (inherits from \code{Geom}, \code{ggproto}, \code{gg}) of length 7.}
\usage{
geom_statebins(mapping = NULL, data = NULL, border_col = "white",
border_size = 2, lbl_size = 3, dark_lbl = "black",
light_lbl = "white", radius = grid::unit(6, "pt"), ..., na.rm = FALSE,
show.legend = NA, inherit.aes = TRUE)
GeomStatebins
}
\description{
WIP!!!!!!!!!!! Full geom documentation coming soon. See Details and the Examples for now.
}
\details{
For now, you pass in:
\itemize{
\item \code{border_col} (border color of the state squares, default "\code{white}")
\item \code{border_size} (thickness of the square state borders)
\item \code{lbl_size} (the relative font size of the state label text, default \code{3})
\item \code{dark_lbl} (the color for the state label text when it shld be dark text on light background)
\item \code{light_lbl} (the color for the state label text when it shld be light text on dark background)
\item \code{radius} (corner radius --- \code{0} for a "square")
}
You also need to (ok, \emph{should}) pass in two \code{aes()} mappings:
\itemize{
\item \code{state} (so the geom knows which column to map the state names/abbrevs to)
\item \code{fill} (which column you're mapping the filling for the squares with)
}
}
\examples{
\dontrun{
library(statebins)
library(cdcfluview)
library(hrbrthemes)
library(tidyverse)
flu <- ili_weekly_activity_indicators(2017)
ggplot(flu, aes(state=statename, fill=activity_level)) +
geom_statebins() +
coord_equal() +
viridis::scale_fill_viridis(
name = "ILI Activity Level ", limits=c(0,10), breaks=0:10, option = "magma", direction = -1
) +
facet_wrap(~weekend) +
labs(title="2017-18 Flu Season ILI Activity Level") +
theme_statebins(base_family = font_ps) +
theme(plot.title=element_text(size=16, hjust=0)) +
theme(plot.margin = margin(30,30,30,30))
}
}
\keyword{datasets}
Loading…
Cancel
Save