How do you make a 50 state map in R?
It seems like all the example maps people have created are just of the lower 48
How do you make a 50 state map in R?
It seems like all the example maps people have created are just of the lower 48
There are lots of ways that you can do this. Personally, I find Google to have the most attractive maps. I recommend ggmap
, googleVis
, and/or RgoogleMaps
.
For example:
require(googleVis)
G4 <- gvisGeoChart(CityPopularity, locationvar='City', colorvar='Popularity',
options=list(region='US', height=350,
displayMode='markers',
colorAxis="{values:[200,400,600,800],
colors:[\'red', \'pink\', \'orange',\'green']}")
)
plot(G4)
Produces this:
Another approach that will give you a more attractive result than maps
is to follow the approach of this tutorial which shows how to import custom maps from Inkscape (or, equivalently, Adobe Illustrator) into R for plotting.
You'll end up with something like this:
Here's a way to it with choroplethr
and ggplot2
:
library(choroplethr)
library(ggplot2)
library(devtools)
install_github('arilamstein/choroplethrZip@v1.3.0')
library(choroplethrZip)
data(df_zip_demographics)
df_zip_demographics$value = df_zip_demographics$percent_asian
zip_map = ZipChoropleth$new(df_zip_demographics)
zip_map$ggplot_polygon = geom_polygon(aes(fill = value),
color = NA)
zip_map$set_zoom_zip(state_zoom = NULL,
county_zoom = NULL,
msa_zoom = NULL,
zip_zoom = NULL)
zip_map$title = "50 State Map for StackOverflow"
zip_map$legend = "Asians"
zip_map$set_num_colors(4)
choro = zip_map$render()
choro
data(df_pop_state)
outline = StateChoropleth$new(df_pop_state)
outline = outline$render_state_outline(tolower(state.name))
choro_with_outline = choro + outline
choro_with_outline
which gives you:
This R-bloggers link might be useful for you.
To give you a look, you can get started on a 50-state map with
library(maps)
map("world", c("USA", "hawaii"), xlim = c(-180, -65), ylim = c(19, 72))
Believe it or not, Hawaii is on there. It's just really small because of the margins.
Resurrecting an old thread because it still doesn't have an accepted answer.
Check out @hrbrmstr's albersusa
package:
devtools::install_github("hrbrmstr/albersusa")
library(albersusa)
plot(usa_composite(proj="laea"))
which produces
and can do much more
us <- usa_composite()
us_map <- fortify(us, region="name")
gg <- ggplot()
gg <- gg + geom_map(data=us_map, map=us_map,
aes(x=long, y=lat, map_id=id),
color="#2b2b2b", size=0.1, fill=NA)
gg <- gg + theme_map()
gg +
geom_map(data=us@data, map=us_map,
aes(fill=pop_2014, map_id=name),
color="white", size=0.1) +
coord_proj(us_laea_proj) +
scale_fill_viridis(name="2014 Populaton Estimates", labels=comma) +
theme(legend.position="right")
You might want to consider using the state.vbm
map in the maptools package, this includes all 50 states and makes the smaller states more visible (works fine for coloring, or adding plots to each state, but distances between sites will not be exact).
Another option is to draw the contiguous 48 states, then in open areas add Alaska and Hawaii yourself. One option for doing this is to use the subplot
function from the TeachingDemos package.
Here is some example code using a couple of the shapefiles provided by the maptools package:
library(maptools)
library(TeachingDemos)
data(state.vbm)
plot(state.vbm)
yy <- readShapePoly(system.file("shapes/co37_d90.shp", package="maptools")[1])
zz <- readShapePoly(system.file("shapes/co51_d90.shp", package="maptools")[1])
xx <- readShapePoly(system.file("shapes/co45_d90.shp", package="maptools")[1])
plot(yy)
par('usr')
subplot( plot(zz), c(-84,-81), c(31,33) )
subplot( plot(xx), c(-81, -78), c(31,33) )
You would just need to find the appropriate shape files for the states.
Using choroplethr
you can create a simple and quick state map by doing the following:
#install.packages("choroplethr")
#install.packages("choroplethrMaps")
library(choroplethr)
library(choroplethrMaps)
data(df_pop_state)
StateChoropleth$new(df_pop_state)$render()
I like this method because it's fast and easy. If you don't want the state labels, removing them requires a little bit more:
c = StateChoropleth$new(df_pop_state)
c$title = "2012 State Population Estimates"
c$legend = "Population"
c$set_num_colors(7)
c$set_zoom(NULL)
c$show_labels = FALSE
without_abbr = c$render()
without_abbr
Here's a comparison of the two methods:
Sources 1 and 2