Choropleth Maps in ggplot2

How to make Choropleth Maps in ggplot2 with Plotly.


Plotly Studio: Transform any dataset into an interactive data application in minutes with AI. Sign up for early access now.

County-Level Boundaries

library(plotly)
library(maps)

county_df <- map_data("county")
state_df <- map_data("state")

# create state boundaries
p <- ggplot(county_df, aes(long, lat, group = group)) +
  geom_polygon(colour = alpha("black", 1/2), fill = NA) +
  geom_polygon(data = state_df, colour = "black", fill = NA) + 
  theme_void()

fig <- ggplotly(p)

fig
Click to copy

County-Level Choropleths

library(plotly)
library(dplyr)
library(maps)

# map data
county_df <- map_data("county")
state_df <- map_data("state")

county_df$subregion <- gsub(" ", "", county_df$subregion)

#election data
df <- read.csv("https://raw.githubusercontent.com/bcdunbar/datasets/master/votes.csv")
df <- subset(df, select = c(Obama, Romney, area_name))

df$area_name <- tolower(df$area_name) 
df$area_name <- gsub(" county", "", df$area_name)
df$area_name <- gsub(" ", "", df$area_name)
df$area_name <- gsub("[.]", "", df$area_name)

df$Obama <- df$Obama*100
df$Romney <- df$Romney*100

for (i in 1:length(df[,1])) {
  if (df$Obama[i] > df$Romney[i]) {
    df$Percent[i] = df$Obama[i]
  } else {
    df$Percent[i] = -df$Romney[i]
  }
}

names(df) <- c("Obama", "Romney", "subregion", "Percent")

# join data
US <- inner_join(county_df, df, by = "subregion")
US <- US[!duplicated(US$order), ]

# colorramp
blue <- colorRampPalette(c("navy","royalblue","lightskyblue"))(200)                      
red <- colorRampPalette(c("mistyrose", "red2","darkred"))(200)

#plot
p <- ggplot(US, aes(long, lat, group = group)) +
  geom_polygon(aes(fill = Percent),
               colour = alpha("white", 1/2), size = 0.05)  +
  geom_polygon(data = state_df, colour = "white", fill = NA) +
  ggtitle("2012 US Election") +
  scale_fill_gradientn(colours=c(blue,"white", red))  +
  theme_void()

fig <- ggplotly(p)

fig
Click to copy

What About Dash?

Dash for R is an open-source framework for building analytical applications, with no Javascript required, and it is tightly integrated with the Plotly graphing library.

Learn about how to install Dash for R at https://dashr.plot.ly/installation.

Everywhere in this page that you see fig, you can display the same figure in a Dash for R application by passing it to the figure argument of the Graph component from the built-in dashCoreComponents package like this:

library(plotly)

fig <- plot_ly() 
# fig <- fig %>% add_trace( ... )
# fig <- fig %>% layout( ... ) 

library(dash)
library(dashCoreComponents)
library(dashHtmlComponents)

app <- Dash$new()
app$layout(
    htmlDiv(
        list(
            dccGraph(figure=fig) 
        )
     )
)

app$run_server(debug=TRUE, dev_tools_hot_reload=FALSE)
Click to copy