Base R Plotting

A choropleth map displays divided geographic regions that are colored in relation to some numerical value. The maps library provides some basic maps for you to do some quick visualization. Here is a map of the continental US.

library(maps)
map('state', projection = "polyconic" )

Some stuff to add. This is the stuff.

I grabbed some census data from the US Census site for each state and saved it as a CSV file. It is currently hosted on a Github site I use for all my ENVS teaching and we can read it directly from Github using the URL.

library(readr)
url <- "https://raw.githubusercontent.com/dyerlab/ENVS-Lectures/master/lectures/spatial/chloropleth_maps/states.csv"
sz <- read_csv( url )
head(sz)

In this data set, there are 48 states (Hawaii & Alaska are not there) and the District of Columbia. To color these, I’m going to use a color palette defined in the RColorBrewer library that goes from yellow to orange to red. This is a sequential color ramp (see brewer.pal.info for other palettes).

library(RColorBrewer)
colors <- brewer.pal(9,"YlOrRd")
colors
[1] "#FFFFCC" "#FFEDA0" "#FED976" "#FEB24C" "#FD8D3C" "#FC4E2A" "#E31A1C"
[8] "#BD0026" "#800026"
#FFFFCC

#FFEDA0

#FED976

#FEB24C

#FD8D3C

#FC4E2A

#E31A1C

#BD0026

#800026

Then I’m going stretch these colors out from 9 distinct colors to 49 colors, one for each State and D.C.

colors <- colorRampPalette( colors )(49)
colors
 [1] "#FFFFCC" "#FFFCC4" "#FFF9BD" "#FFF6B6" "#FFF3AE" "#FFF0A7" "#FFEDA0"
 [8] "#FEE999" "#FEE692" "#FEE38B" "#FEDF84" "#FEDC7D" "#FED976" "#FED26F"
[15] "#FECC68" "#FEC561" "#FEBF5A" "#FEB853" "#FEB24C" "#FDAB49" "#FDA546"
[22] "#FD9F44" "#FD9941" "#FD933E" "#FD8D3C" "#FC8239" "#FC7836" "#FC6D33"
[29] "#FC6330" "#FC582D" "#FC4E2A" "#F74527" "#F33C25" "#EF3423" "#EB2B20"
[36] "#E7221E" "#E31A1C" "#DC151D" "#D6111F" "#D00D20" "#C90822" "#C30424"
[43] "#BD0026" "#B20026" "#A80026" "#9E0026" "#940026" "#8A0026" "#800026"
#FFFFCC

#FFFCC4

#FFF9BD

#FFF6B6

#FFF3AE

#FFF0A7

#FFEDA0

#FEE999

#FEE692

#FEE38B

#FEDF84

#FEDC7D

#FED976

#FED26F

#FECC68

#FEC561

#FEBF5A

#FEB853

#FEB24C

#FDAB49

#FDA546

#FD9F44

#FD9941

#FD933E

#FD8D3C

#FC8239

#FC7836

#FC6D33

#FC6330

#FC582D

#FC4E2A

#F74527

#F33C25

#EF3423

#EB2B20

#E7221E

#E31A1C

#DC151D

#D6111F

#D00D20

#C90822

#C30424

#BD0026

#B20026

#A80026

#9E0026

#940026

#8A0026

#800026

Then I can cut the data into 49 chunks and then assign each state to one of thos

groups <- cut( sz$population, 49 )
sz$colors <- colors[ groups ]
head(sz)
map( 'state', 
     col=sz$colors, 
     fill=TRUE, 
     projection="polyconic")

LS0tCnRpdGxlOiAiQ2hvcm9wbGV0aCBNYXBzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKIyMgQmFzZSBSIFBsb3R0aW5nCgpBIGNob3JvcGxldGggbWFwIGRpc3BsYXlzIGRpdmlkZWQgZ2VvZ3JhcGhpYyByZWdpb25zIHRoYXQgYXJlIGNvbG9yZWQgaW4gcmVsYXRpb24gdG8gc29tZSBudW1lcmljYWwgdmFsdWUuICBUaGUgYG1hcHNgIGxpYnJhcnkgcHJvdmlkZXMgc29tZSBiYXNpYyBtYXBzIGZvciB5b3UgdG8gZG8gc29tZSBxdWljayB2aXN1YWxpemF0aW9uLiAgSGVyZSBpcyBhIG1hcCBvZiB0aGUgY29udGluZW50YWwgVVMuICAKCmBgYHtyfQpsaWJyYXJ5KG1hcHMpCm1hcCgnc3RhdGUnLCBwcm9qZWN0aW9uID0gInBvbHljb25pYyIgKQpgYGAKClNvbWUgc3R1ZmYgdG8gYWRkLiBUaGlzIGlzIHRoZSBzdHVmZi4KCi0gRmlyc3QgIAotIFNlY29uZCAgCi0gVGhyaXJkICAKCgpJIGdyYWJiZWQgc29tZSBjZW5zdXMgZGF0YSBmcm9tIHRoZSBVUyBDZW5zdXMgc2l0ZSBmb3IgZWFjaCBzdGF0ZSBhbmQgc2F2ZWQgaXQgYXMgYSBDU1YgZmlsZS4gIEl0IGlzIGN1cnJlbnRseSBob3N0ZWQgb24gYSBHaXRodWIgc2l0ZSBJIHVzZSBmb3IgYWxsIG15IEVOVlMgdGVhY2hpbmcgYW5kIHdlIGNhbiByZWFkIGl0IGRpcmVjdGx5IGZyb20gR2l0aHViIHVzaW5nIHRoZSBVUkwuCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHJlYWRyKQp1cmwgPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9keWVybGFiL0VOVlMtTGVjdHVyZXMvbWFzdGVyL2xlY3R1cmVzL3NwYXRpYWwvY2hsb3JvcGxldGhfbWFwcy9zdGF0ZXMuY3N2IgpzeiA8LSByZWFkX2NzdiggdXJsICkKaGVhZChzeikKYGBgCkluIHRoaXMgZGF0YSBzZXQsIHRoZXJlIGFyZSA0OCBzdGF0ZXMgKEhhd2FpaSAmIEFsYXNrYSBhcmUgbm90IHRoZXJlKSBhbmQgdGhlIERpc3RyaWN0IG9mIENvbHVtYmlhLiAgVG8gY29sb3IgdGhlc2UsIEknbSBnb2luZyB0byB1c2UgYSBjb2xvciBwYWxldHRlIGRlZmluZWQgaW4gdGhlIGBSQ29sb3JCcmV3ZXJgIGxpYnJhcnkgdGhhdCBnb2VzIGZyb20geWVsbG93IHRvIG9yYW5nZSB0byByZWQuICBUaGlzIGlzIGEgc2VxdWVudGlhbCBjb2xvciByYW1wIChzZWUgIGBicmV3ZXIucGFsLmluZm9gIGZvciBvdGhlciBwYWxldHRlcykuCgoKYGBge3J9CmxpYnJhcnkoUkNvbG9yQnJld2VyKQpjb2xvcnMgPC0gYnJld2VyLnBhbCg5LCJZbE9yUmQiKQpjb2xvcnMKYGBgCgpUaGVuIEknbSBnb2luZyBzdHJldGNoIHRoZXNlIGNvbG9ycyBvdXQgZnJvbSA5IGRpc3RpbmN0IGNvbG9ycyB0byA0OSBjb2xvcnMsIG9uZSBmb3IgZWFjaCBTdGF0ZSBhbmQgRC5DLgoKYGBge3J9CmNvbG9ycyA8LSBjb2xvclJhbXBQYWxldHRlKCBjb2xvcnMgKSg0OSkKY29sb3JzCmBgYAoKVGhlbiBJIGNhbiBgY3V0YCB0aGUgZGF0YSBpbnRvIDQ5IGNodW5rcyBhbmQgdGhlbiBhc3NpZ24gZWFjaCBzdGF0ZSB0byBvbmUgb2YgdGhvcwoKCgpgYGB7cn0KZ3JvdXBzIDwtIGN1dCggc3okcG9wdWxhdGlvbiwgNDkgKQpzeiRjb2xvcnMgPC0gY29sb3JzWyBncm91cHMgXQpoZWFkKHN6KQpgYGAKCmBgYHtyfQptYXAoICdzdGF0ZScsIAogICAgIGNvbD1zeiRjb2xvcnMsIAogICAgIGZpbGw9VFJVRSwgCiAgICAgcHJvamVjdGlvbj0icG9seWNvbmljIikKYGBg