Search code examples
rggplot2usmap

How merge specific states together by group with one label in ggplot2 in R?


I want to plot Electric grid map for U.S. So I need to merge specific states together . I want to plot border for those state together but it not working. Also just one label per each group. This is my data : [https://iastate.box.com/s/12xru62lvmbbkrohsn7b4wwexq11umn7] This is my code:

# Join and arrange
 states <- us_map(exclude = c("AK", "HI"))
 states_data <- left_join(states, myinput, by = c("abbr" = "region")) |> 
 arrange(emission, growth, group, order)

ggplot(states_data, aes(x, y, fill = value, group = group, subgroup = grid)) +
geom_polygon()+
scale_fill_continuous(low = "white", high = "red", name = "Ele gen (EJ)", label = 
scales::comma) +
facet_grid(emission~growth) +
coord_equal() +
ggthemes::theme_map() +
theme(legend.position = "bottom")+
geom_text(aes(x, y, label = grid),size = 5,family = "serif",
        data = states_data, vjust = 1.2, nudge_y = -100000,check_overlap = T)+
geom_polygon(aes(color = "Border", group=grid),fill = NA,color = "black")

And this the output which is not what I have in my mid: enter image description here

I want to plot these regions (plus borders to specify because I can't show them with different color) enter image description here

data

structure(list(region = c("AL", "AR", "AZ", "CA", "CO", "CT", 
"DC", "DE", "FL", "GA", "IA", "ID", "IL", "IN", "KS", "KY", "LA", 
"MA", "MD", "ME", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", 
"NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "RI", "SC", 
"SD", "TN", "TX", "UT", "VA", "VT", "WA", "WI", "WV", "WY", "AL", 
"AR", "AZ", "CA", "CO", "CT", "DC", "DE", "FL", "GA", "IA", "ID", 
"IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", "MO", 
"MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", 
"OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VA", "VT", 
"WA", "WI", "WV", "WY", "AL", "AR", "AZ", "CA", "CO", "CT", "DC", 
"DE", "FL", "GA", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", 
"MD", "ME", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", 
"NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "RI", "SC", "SD", 
"TN", "TX", "UT", "VA", "VT", "WA", "WI", "WV", "WY", "AL", "AR", 
"AZ", "CA", "CO", "CT", "DC", "DE", "FL", "GA", "IA", "ID", "IL", 
"IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", "MO", "MS", 
"MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", 
"OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VA", "VT", "WA", 
"WI", "WV", "WY"), value = c(6.22256321333333, 6.22256321333333, 
2.20794523906666, 1.49034165333333, 2.20794523906666, 0.826546816817333, 
2.61905459786667, 2.61905459786667, 1.65110329, 6.22256321333333, 
1.59528739166667, 3.0363665376, 3.13763399333332, 3.865420576, 
0.790624669333333, 3.865420576, 6.22256321333333, 0.826546816817333, 
2.61905459786667, 0.826546816817333, 3.865420576, 1.59528739166667, 
3.13763399333332, 6.22256321333333, 3.0363665376, 6.22256321333333, 
1.59528739166667, 1.59528739166667, 0.826546816817333, 2.61905459786667, 
2.20794523906666, 3.0363665376, 1.21040939333333, 3.865420576, 
0.790624669333333, 3.0363665376, 2.61905459786667, 0.826546816817333, 
6.22256321333333, 1.59528739166667, 6.22256321333333, 3.50149982333333, 
3.0363665376, 6.22256321333333, 0.826546816817333, 3.0363665376, 
3.13763399333332, 3.865420576, 2.20794523906666, 6.58823506033333, 
6.58823506033333, 2.33729970666667, 1.35043392, 2.33729970666667, 
0.7918773089276, 2.64941819863333, 2.64941819863333, 1.84968858666667, 
6.58823506033333, 1.69423596966667, 2.82831107136667, 3.22375391666666, 
4.14114214399999, 0.816646300333333, 4.14114214399999, 6.58823506033333, 
0.7918773089276, 2.64941819863333, 0.7918773089276, 4.14114214399999, 
1.69423596966667, 3.22375391666666, 6.58823506033333, 2.82831107136667, 
6.58823506033333, 1.69423596966667, 1.69423596966667, 0.7918773089276, 
2.64941819863333, 2.33729970666667, 2.82831107136667, 1.15469864333333, 
4.14114214399999, 0.816646300333333, 2.82831107136667, 2.64941819863333, 
0.7918773089276, 6.58823506033333, 1.69423596966667, 6.58823506033333, 
3.66557223, 2.82831107136667, 6.58823506033333, 0.7918773089276, 
2.82831107136667, 3.22375391666666, 4.14114214399999, 2.33729970666667, 
6.72966092166666, 6.72966092166666, 2.3737108016, 1.58503659, 
2.3737108016, 0.884016546345666, 2.8041352651, 2.8041352651, 
1.73653393333333, 6.72966092166666, 1.73917558366667, 3.23410557176666, 
3.34795298333333, 4.19485727566666, 0.859289106, 4.19485727566666, 
6.72966092166666, 0.884016546345666, 2.8041352651, 0.884016546345666, 
4.19485727566666, 1.73917558366667, 3.34795298333333, 6.72966092166666, 
3.23410557176666, 6.72966092166666, 1.73917558366667, 1.73917558366667, 
0.884016546345666, 2.8041352651, 2.3737108016, 3.23410557176666, 
1.28265139333333, 4.19485727566666, 0.859289106, 3.23410557176666, 
2.8041352651, 0.884016546345666, 6.72966092166666, 1.73917558366667, 
6.72966092166666, 3.79724887666667, 3.23410557176666, 6.72966092166666, 
0.884016546345666, 3.23410557176666, 3.34795298333333, 4.19485727566666, 
2.3737108016, 6.58823506033333, 6.58823506033333, 2.33729970666667, 
1.35043392, 2.33729970666667, 0.7918773089276, 2.64941819863333, 
2.64941819863333, 1.84968858666667, 6.58823506033333, 1.69423596966667, 
2.82831107136667, 3.22375391666666, 4.14114214399999, 0.816646300333333, 
4.14114214399999, 6.58823506033333, 0.7918773089276, 2.64941819863333, 
0.7918773089276, 4.14114214399999, 1.69423596966667, 3.22375391666666, 
6.58823506033333, 2.82831107136667, 6.58823506033333, 1.69423596966667, 
1.69423596966667, 0.7918773089276, 2.64941819863333, 2.33729970666667, 
2.82831107136667, 1.15469864333333, 4.14114214399999, 0.816646300333333, 
2.82831107136667, 2.64941819863333, 0.7918773089276, 6.58823506033333, 
1.69423596966667, 6.58823506033333, 3.66557223, 2.82831107136667, 
6.58823506033333, 0.7918773089276, 2.82831107136667, 3.22375391666666, 
4.14114214399999, 2.33729970666667), grid = c("Southeast grid", 
"Southeast grid", "Southwest grid", "California grid", "Southwest grid", 
"New England grid", "Mid-Atlantic grid", "Mid-Atlantic grid", 
"Florida grid", "Southeast grid", "Central Northwest grid", "Northwest grid", 
"Central Northeast grid", "Central East grid", "Central Southwest grid", 
"Central East grid", "Southeast grid", "New England grid", "Mid-Atlantic grid", 
"New England grid", "Central East grid", "Central Northwest grid", 
"Central Northeast grid", "Southeast grid", "Northwest grid", 
"Southeast grid", "Central Northwest grid", "Central Northwest grid", 
"New England grid", "Mid-Atlantic grid", "Southwest grid", "Northwest grid", 
"New York grid", "Central East grid", "Central Southwest grid", 
"Northwest grid", "Mid-Atlantic grid", "New England grid", "Southeast grid", 
"Central Northwest grid", "Southeast grid", "Texas grid", "Northwest grid", 
"Southeast grid", "New England grid", "Northwest grid", "Central Northeast grid", 
"Central East grid", "Southwest grid", "Southeast grid", "Southeast grid", 
"Southwest grid", "California grid", "Southwest grid", "New England grid", 
"Mid-Atlantic grid", "Mid-Atlantic grid", "Florida grid", "Southeast grid", 
"Central Northwest grid", "Northwest grid", "Central Northeast grid", 
"Central East grid", "Central Southwest grid", "Central East grid", 
"Southeast grid", "New England grid", "Mid-Atlantic grid", "New England grid", 
"Central East grid", "Central Northwest grid", "Central Northeast grid", 
"Southeast grid", "Northwest grid", "Southeast grid", "Central Northwest grid", 
"Central Northwest grid", "New England grid", "Mid-Atlantic grid", 
"Southwest grid", "Northwest grid", "New York grid", "Central East grid", 
"Central Southwest grid", "Northwest grid", "Mid-Atlantic grid", 
"New England grid", "Southeast grid", "Central Northwest grid", 
"Southeast grid", "Texas grid", "Northwest grid", "Southeast grid", 
"New England grid", "Northwest grid", "Central Northeast grid", 
"Central East grid", "Southwest grid", "Southeast grid", "Southeast grid", 
"Southwest grid", "California grid", "Southwest grid", "New England grid", 
"Mid-Atlantic grid", "Mid-Atlantic grid", "Florida grid", "Southeast grid", 
"Central Northwest grid", "Northwest grid", "Central Northeast grid", 
"Central East grid", "Central Southwest grid", "Central East grid", 
"Southeast grid", "New England grid", "Mid-Atlantic grid", "New England grid", 
"Central East grid", "Central Northwest grid", "Central Northeast grid", 
"Southeast grid", "Northwest grid", "Southeast grid", "Central Northwest grid", 
"Central Northwest grid", "New England grid", "Mid-Atlantic grid", 
"Southwest grid", "Northwest grid", "New York grid", "Central East grid", 
"Central Southwest grid", "Northwest grid", "Mid-Atlantic grid", 
"New England grid", "Southeast grid", "Central Northwest grid", 
"Southeast grid", "Texas grid", "Northwest grid", "Southeast grid", 
"New England grid", "Northwest grid", "Central Northeast grid", 
"Central East grid", "Southwest grid", "Southeast grid", "Southeast grid", 
"Southwest grid", "California grid", "Southwest grid", "New England grid", 
"Mid-Atlantic grid", "Mid-Atlantic grid", "Florida grid", "Southeast grid", 
"Central Northwest grid", "Northwest grid", "Central Northeast grid", 
"Central East grid", "Central Southwest grid", "Central East grid", 
"Southeast grid", "New England grid", "Mid-Atlantic grid", "New England grid", 
"Central East grid", "Central Northwest grid", "Central Northeast grid", 
"Southeast grid", "Northwest grid", "Southeast grid", "Central Northwest grid", 
"Central Northwest grid", "New England grid", "Mid-Atlantic grid", 
"Southwest grid", "Northwest grid", "New York grid", "Central East grid", 
"Central Southwest grid", "Northwest grid", "Mid-Atlantic grid", 
"New England grid", "Southeast grid", "Central Northwest grid", 
"Southeast grid", "Texas grid", "Northwest grid", "Southeast grid", 
"New England grid", "Northwest grid", "Central Northeast grid", 
"Central East grid", "Southwest grid"), emission = c("Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Low Emission", "Low Emission", "Low Emission", "Low Emission", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference", "Reference", 
"Reference", "Reference", "Reference", "Reference"), growth = c("Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "Low Population/GDP", "Low Population/GDP", 
"Low Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP", 
"High Population/GDP", "High Population/GDP", "High Population/GDP"
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-196L))

Solution

  • You will need to use shapefiles/ simple feature [sf] objects rather than mere data frames.

    The usmap package is a high level package which is meant for convenient production of standard US maps. It does not come with shapefiles but contains the polygon data in actual data frames (provided by the package usmapdata. Custom merging of states is not facilitated by this package.

    Merging polygons in a data frame is not impossible, but it's not easy. It would also be re-inventing the wheel, as the sf package was built just for things like this. But it works only with shapefiles / sf objects.

    Good news, the US is not an unpopular country in the R world, and there are other R packages which contain US map data, e.g. USAboundaries, which comes with shapefiles.

    The sf package allows you to merge (here this process is called unionise) polygons easily, e.g. with simple summarising. (see below).

    You can then use ggplot2's very own geom_sf for the unionised polygons and geom_sf_text or geom_sf_label for the labels.

    Further comments in the code.

    library(tidyverse)
    ## use for example this for US shapefile maps
    library(USAboundaries)
    ## you will need the sf package for some stuff
    library(sf)
    
    # my_data <- ... from your question above
    
    states <- us_states()
    states <- states[!states$name %in% c("Alaska", "Hawaii"),]
    ##remove arrange
    states_data <- left_join(states, my_data, by = c("state_abbr" = "region" )) %>%
    ## there is an NA value that needs removal
    drop_na(grid)
    
    ## this is to unionise the polygons
    custom_grids <- 
      states_data %>%
    ## group by all the variables that occur in the facets
      group_by(grid, emission, growth) %>%
      summarise(value = mean(value))
    
    ## you can now plot the unionised polygon sf object with geom_sf and geom_sf_text for labels
    ggplot(custom_grids) +
      geom_sf(aes(fill = value)) +
      geom_sf_text(aes(label = grid), check_overlap = T)+
      scale_fill_viridis_c() +
      facet_grid(emission~growth) 
    

    enter image description here