Используя usmap, я построил график значений по округам США на основе некоторых значений, хранящихся в переменной county. До того, как я недавно обновил R и все свои пакеты, я мог легко создать карту округа с толстыми границами штатов и аббревиатурами штатов, используя следующий код:
library(ggplot2)
library(usmap)
centroid_labels = usmapdata::centroid_labels("states")
plotdf = data.frame(cbind(county$FIPS,county$SES)); plotdf[,2] = as.numeric(as.character(plotdf[,2])); names(plotdf) = c("fips", "SES");
plot_usmap(data = plotdf, values = "SES", color = NA) + # color = NA removes county boundary lines
geom_polygon(data = usmapdata::us_map(regions = "states"), aes(x, y, group = group), fill = NA, linewidth = 1, color = "black") + # Keep state boundary lines
geom_text(data = centroid_labels, aes(x = x, y = y, label = abbr), fontface = "bold", colour = "gray12", size = 3)
Если добавить еще несколько строк для изменения цвета и тому подобное, получится такая картинка:
Однако, как уже упоминалось, поскольку я обновил пакеты, у меня это больше не работает. В частности, мне выдает ошибку, что объект x не найден. В поисках ответа кажется, что другие столкнулись с подобной проблемой. Это означает, что я могу рисовать округа, но строки кода, создающие линии штатов и сокращения штатов, больше не работают. Если удалить то, что не работает, получится что-то вроде этого:
Вопрос: Есть ли другой способ нарисовать границы штатов на этой карте округа, а также добавить сокращения штатов?





Вот один из подходов с использованием пакетов geodata и sf.
library(tidyverse)
library(geodata)
library(sf)
# USA states
usa_shp <- gadm(country = 'USA', level = 1, path=tempdir()) %>%
st_as_sf()
# USA counties
usa_county <- gadm(country = 'USA', level = 2, path=tempdir()) %>%
st_as_sf() %>%
filter(ENGTYPE_2 != 'Water body') %>%
select(COUNTRY,NAME_1,NAME_2) %>%
rename(country = COUNTRY,
state = NAME_1,
county = NAME_2) %>%
mutate(SES = round(rnorm(3137, 100, 50)))
# Centroids of USA states
centroids_usa <- usa_shp %>%
st_centroid(of_largest_polygon = TRUE) %>%
select(ISO_1) %>%
separate(ISO_1,
c('country','state_abb'))
#> Warning: st_centroid assumes attributes are constant over geometries
# Map
ggplot() +
geom_sf(data = usa_county,
mapping = aes(geometry = geometry, fill = SES),
color = NA) +
geom_sf(data = usa_shp,
mapping = aes(geometry = geometry),
color = "black",
linewidth = 1,
fill = NA) +
geom_sf_text(data = centroids_usa,
mapping = aes(geometry = geometry, label = state_abb),
fontface = 'bold',
color = 'gray12',
size = 3) +
coord_sf(xlim = c(-125.5, -66), ylim = c(24.3, 49.5), expand = F) +
scale_fill_gradient2(low = "blue", high = "red", mid = 'white',
midpoint = 0) +
labs(x = NULL, y = NULL) +
theme_bw() +
theme(text = element_text(size = 16),
axis.text.x = element_text(size = 14, color = "black"),
axis.text.y = element_text(size = 14, color = "black"),
legend.position = 'none')
#> Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
#> give correct results for longitude/latitude data

Created on 2024-05-24 with reprex v2.1.0
Вот еще один подход, который ближе к исходному заданному вопросу.
library(ggplot2)
library(usmap)
# Extract data for states and counties
states_data <- us_map("states")
counties_data <- us_map("counties")
counties_data$SES <- rnorm(3144, 100, 100)
centroid_labels = usmapdata::centroid_labels("states")
# Map
plot_usmap("counties", color = 'NA') +
geom_sf(data = counties_data,
mapping = aes(geometry = geom, fill = SES),
color = NA) +
geom_sf(data = states_data,
mapping = aes(geometry = geom),
color = 'black',
linewidth = 1,
fill = NA) +
geom_sf_text(data = centroid_labels,
mapping = aes(geometry = geom, label = abbr),
fontface = 'bold',
color = 'gray12',
size = 3) +
scale_fill_gradient2(low = "blue", high = "red", mid = 'white',
midpoint = 0) +
theme(legend.position = 'none')

Created on 2024-05-24 with reprex v2.1.0
Спасибо! Это отлично работает и его легко реализовать. Я попробовал другое ваше решение, но не смог получить что-то, что меня удовлетворило (в частности, карта США перемещает Аляску и Гавайи, поэтому границы штатов Сан-Франциско там не вписывались. Кроме того, были некоторые небольшие различия в границах штатов между двумя штатами, что выглядело немного необычно).