MarkWeiss
MarkWeiss

Reputation: 59

US Map with ggplot2

I'm trying to plot a map of a categorical variable using ggplot2, where states are shaded one color if they at any point introduced a certain bill, and another color if they never have. The shading appears to work, but the geom objects do not properly fit the state borders (plot output linked here).

I'm not sure why this is the case. Here's the code I used:

all_states <- map_data("state")
all_states <- rename(all_states,
                     state = "region")
all_states$state <- str_to_title(all_states$state)

# select states that introduced bill
int <- read_csv("int.csv", col_types = cols(introduced = col_integer()))
statelist <- int$state 
statelist <- state.name[match(statelist, state.abb)]

int <- cbind(statelist, int)
int <- select(int, statelist, introduced)

int <-  rename(int,
               state = statelist)

stateData <- merge(all_states, int, by="state")

# plot bill introduction
plot1 <- ggplot() + 
geom_polygon(data=stateData, aes(x=long, y=lat, 
  group=group, fill = as.factor(introduced)), color = "grey50") +
   coord_map() 

Upvotes: 1

Views: 372

Answers (1)

stefan
stefan

Reputation: 125478

The issue is most likely that the merge breaks the order of the maps dataframe given by the order column, i.e. geom_polygon will connect the points in the order as they appear in the dataset.

Using some fake random example data I can reproduce your issue:

library(stringr)
library(ggplot2)

all_states <- map_data("state")
all_states <- dplyr::rename(all_states,
                     state = "region"
)
all_states$state <- str_to_title(all_states$state)

library(ggplot2)
library(dplyr, warn = FALSE)

int <- data.frame(
  state = state.name,
  introduced = sample(c(0, 1), 50, replace = TRUE)
)
stateData <- merge(all_states, int, by = "state")

ggplot() +
  geom_polygon(data = stateData, aes(x = long, y = lat, group = group, fill = as.factor(introduced)), color = "grey50") +
  coord_map()

To fix that we could re-arrange the data by the order column (per state and group)


stateData <- stateData |> 
  arrange(state, group, order)

ggplot() +
  geom_polygon(data = stateData, aes(x = long, y = lat, group = group, fill = as.factor(introduced)), color = "grey50") +
  coord_map()

Upvotes: 1

Related Questions