You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Bob Rudis d26229bf4a
Updated README
8 years ago
R 1.2.1 release 8 years ago
README_files/figure-markdown_github 1.2.1 release 8 years ago
_README_files/figure-markdown_github Updating for CRAN submission 9 years ago
man 1.2.1 release 8 years ago
tests initial commit 9 years ago
tmp Re-added missing img 8 years ago
.Rbuildignore CRAN submission 9 years ago
.gitignore initial commit 9 years ago
.travis.yml initial commit 9 years ago
DESCRIPTION 1.2.1 release 8 years ago
LICENSE Submitted to CRAN 9 years ago
NAMESPACE 1.2.1 release 8 years ago
README.Rmd Updated README 8 years ago Updated README 8 years ago
statebins.Rproj Submitted to CRAN 9 years ago

statebins - U.S. State Cartogram Heatmaps in R; an alternative to choropleth maps for USA States

The following functions are implemented:

  • statebins - creates "statebin" charts in the style of - This version uses discrete RColorBrewer scales, binned by the "breaks" parameter.
  • statebins_continuous - creates "statebin" charts in the style of - This version uses a continuous scale based on RColorBrewer scales (passing in a 6 element RColorBrewer palette to scale_fill_gradientn).
  • statebins_manual - creates "statebin" charts using manually specified colors in a column


  • The current version is usable, but I think the plot margins and the legends need work
  • Apply algorithm to switch to light-on-dark depending on the background tile color


  • Version 1.2.1 released - Added support for PR/Puerto Rico[1] and fixed a bug[2] when using anything but a data.frame as input. Also no longer fails (deals with the following but with a warning) when duplicate states are in the input data or invalid states are in the input data.
  • Version 1.1.0 released - statebins_manual() for manual placement of colors and moving of AK in support of a pull request by hansthompson
  • Version 1.0.0 released




All of the following examples use the WaPo data. It looks like the columns they use are scaled data and I didn't take the time to figure out what they did, so the final figure just mimics their output (including the non-annotated legend).


# current verison
## [1] '1.2.1'
# the original wapo data

dat <- read.csv("", stringsAsFactors=FALSE)

gg <- statebins(dat, "state", "avgshare94_00", breaks=4, 
                labels=c("0-1", "1-2", "2-3", "3-4"),
                legend_title="Share of workforce with jobs lost or threatened by trade", font_size=3, 
                brewer_pal="Blues", text_color="black", 
                plot_title="1994-2000", title_position="bottom")


# continuous scale, legend on top

gg2 <- statebins_continuous(dat, "state", "avgshare01_07",
                            legend_title="Share of workforce with jobs lost or threatened by trade", legend_position="top",
                            brewer_pal="OrRd", text_color="black", font_size=3, 
                            plot_title="2001-2007", title_position="bottom")


# continuous scale, no legend

gg3 <- statebins_continuous(dat, "state", "avgshare08_12",
                            legend_title="States", legend_position="none",
                            brewer_pal="Purples", text_color="black", font_size=3, 
                            plot_title="2008-2012", title_position="bottom")


# mortality (only to show PR and using a data.table)
# from:

dat <- data.table::fread("")
statebins_continuous(dat, "state", "death_rate", legend_title="Per 100K pop",
                    plot_title="Mortality Rate (2010)")

# fertility (only to show tbl_dt)

dat <- dplyr::tbl_dt(dat)
statebins_continuous(dat, "state", "fertility_rate", legend_title="Per 100K pop", 
                     plot_title="Fertility Rate (2010)", brewer_pal="PuBuGn")

# manual - perhaps good for elections?

election_2012 <- GET("")
results <- read.csv(textConnection(content(election_2012, as="text")), header=TRUE, stringsAsFactors=FALSE)
results <- results %>% mutate(color=ifelse(, "#2166ac", "#b2182b")) %>% select(state, color)
results %>% statebins_manual(font_size=4, text_color = "white", labels=c("Romney", "Obama"), legend_position="right", legend_title="Winner")

# or, more like the one in the WaPo article; i might be picking the wrong columns here. it's just for an example

sb <- function(col, title) {
  statebins(dat, "state",col, brewer_pal="Blues", text_color="black", legend_position="none", font_size=3, plot_title=title, breaks=4, labels=1:4)
# cheating and using <table> to arrange them below and also making a WaPo-like legend, 
# since mucking with grid graphics margins/padding was not an option time-wise at the moment

sb("avgshare94_00", "1994-2000")
sb("avgshare01_07", "2001-2007")
sb("avgshare08_12", "2008-2012")
![img](./tmp/statebins-composite.png) And, we'll throw in a gratuitous animation for good measure:
# data set from StatsAmerica -

# median household income from the ACS survey
miacs <- read.csv("", header=TRUE, stringsAsFactors=FALSE)

# generate frames based on year
sapply(unique(miacs$year), function(year) {
  png(file=sprintf("tmp/household%d.png", year),
      type="quartz", antialias="subpixel", width=800, height=600)
  rng <- floor(range(miacs[miacs$year==year,]$mh_inc))
  ggtmp <- statebins(miacs[miacs$year==year,], "state", "mh_inc",
                   legend_title="States", legend_position="none",
                   brewer_pal="Greens", text_color="black", font_size=3,
                   plot_title=sprintf("Median Household Income (ACS) %d\n$%s - $%s", year, comma(rng[1]), comma(rng[2])), title_position="top")

# animate them with ImageMagick
system("convert -background white -alpha remove -layers OptimizePlus -delay 150 tmp/*.png -loop 1 tmp/household.gif")
![img](./tmp/household.gif) ### Test Results

## [1] "Fri Jan 30 06:10:21 2015"
## basic functionality :