user2634146
user2634146

Reputation: 27

Adding State abbreviations to map generated using ggplot2

I am trying to add state abbreviations to a US map generated using ggplot2 and having some difficulties with it. I believe the "fill = " option is causing it, but I am not sure.

Below I provide the code I am using. Initially, I generate the map the way I want except for the state names. Next, I try to overlay state abbreviations on the same map.

Unfortunately it is not working out for me. If I comment out "fill = " option from the first map, I can generate a map with state abbreviations. But that map does not show what I intend to show. I have tried several ways. I am just leaving one option in the code for the moment.

To add the state abbreviations, I am following some of the suggestions I have read in this forum. In particular, I am trying to follow the advice from a discussion titled "ggplot centered names on a map" dated February 25, 2012.

I would appreciate any help on how I can add/overlay the state abbreviations to the first map.

# Master US location data
states <- map_data("state")

# Read in the data
rate <- read.csv("~/R/HealthCare/Data/Test_data.csv")

names(rate) <- tolower(names(rate))
rate$numer <- as.factor(rate$numer)
rate$region <- tolower(rate$statename)


# Create data for US mapping
tomap <- merge(states, rate, sort = FALSE, by = "region")
tomap <- tomap[order(tomap$order), ]


  ## US Map

 # 1. Target Map (w/o state abbr)
p <- qplot(long, lat, data = tomap, 
            group = group, 
            fill = numer,
            geom = "polygon")

p + scale_fill_brewer(palette = "Greens",
                    guide = guide_legend(reverse = TRUE),
                    labels = c("1st cat", "2nd cat", 
                               "3rd cat", "4th cat")) 



  # 2. Add State Abbreviations to Target Map
stannote <- aggregate(cbind(long, lat, group, numer) ~ stateabbr, data = tomap, 
                      FUN=function(x)mean(range(x)))


q <-  qplot(long, lat, data = tomap, 
            group = group,
            #fill = numer,
            fill = "red", #testing
            geom = "polygon") +
  geom_text(data=stannote, aes(long, lat, label = stateabbr), color = "blue", size=3) +
  coord_map()

q

The sample data file looks like the following –

StateName,StateAbbr,Numer
Alabama,AL,0
Alaska,AK,0
Arizona,AZ,0
Arkansas,AR,0
California,CA,0
Colorado,CO,0
Connecticut,CT,0
Delaware,DE,0
District of Columbia,DC,1
Florida,FL,0
Georgia,GA,0
Hawaii,HI,0
Idaho,ID,1
Illinois,IL,0
Indiana,IN,0
Iowa,IA,1
Kansas,KS,0
Kentucky,KY,1
Louisiana,LA,1
Maine,ME,2
Maryland,MD,0
Massachusetts,MA,2
Michigan,MI,0
Minnesota,MN,1
Mississippi,MS,0
Missouri,MO,0
Montana,MT,0
Nebraska,NE,0
Nevada,NV,1
New Hampshire,NH,1
New Jersey,NJ,2
New Mexico,NM,1
New York,NY,3
North Carolina,NC,0
North Dakota,ND,1
Ohio,OH,0
Oklahoma,OK,0
Oregon,OR,2
Pennsylvania,PA,0
Rhode Island,RI,0
South Carolina,SC,0
South Dakota,SD,1
Tennessee,TN,0
Texas,TX,0
Utah,UT,1
Vermont,VT,2
Virginia,VA,0
Washington,WA,2
West Virginia,WV,0
Wisconsin,WI,0
Wyoming,WY,0

Upvotes: 0

Views: 6481

Answers (1)

aosmith
aosmith

Reputation: 36076

As often happens to me with R, it turns out the error message was telling you exactly what was happening (it just takes a while to figure it out). Your numer variable in your second dataset stannote is continuous (check the structure with str(stannote) to see this). So you can just change that variable to a factor. Watch out, though: when you used cbind in aggregate I think you forced the factor to be turned into a numeric variable and so numer in stannote goes from 1-4 instead of 0-3.

Option 1:

stannote$numer = factor(stannote$numer, labels = c(0, 1, 2, 3))
qplot(long, lat, data = tomap, 
            group = group,
            fill = numer, #testing
            geom = "polygon") +
  geom_text(data=stannote, aes(long, lat, label = stateabbr),
                    color = "blue", size=3) + scale_fill_brewer(palette = "Greens")

Alternatively, you could remove the fill aesthetic that you set for the overall plot from the call to geom_text using fill = NULL. You don't actually need fill for the text, just for the polygons. This is a situation where if you were using ggplot instead of qplot you might just set the fill aesthetic for geom_polygon.

Option 2:

stannote$numer = as.numeric(stannote$numer)
qplot(long, lat, data = tomap, 
            group = group,
            fill = numer, #testing
            geom = "polygon") +
  geom_text(data=stannote, aes(long, lat, label = stateabbr, fill = NULL),
                    color = "blue", size=3) + scale_fill_brewer(palette = "Greens")

Upvotes: 1

Related Questions