There are many ways you can do this. Personally, I believe that Google has 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 the following:

Another approach, which will give you a more attractive result than maps , should follow the approach of this tutorial , which shows how to import custom maps from Inkscape (or, equivalently, Adobe Illustrator) to R for plotting.
You end up with something like this:

Here is the path 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:

Hack-r
source share