Вот решение как раз с ggplot2
.
- Получить данные многоугольника с помощью
usmap::us_map
. (как и вы) - Левое соединение с вашими общими данными (сначала заглавные буквы в именах регионов)
- Создайте центроиды для текстовой аннотации .
- Эти центроиды и общий ресурс лучше всего помещать в отдельный фрейм данных
- Нарисуйте многоугольники с помощью
geom_polygon
- Нарисуйте свои метки (аббревиатуры штата и доли) с помощью
geom_text
, используя paste. (вы также можете использовать annotate
) - Передайте данные отдельно на каждый слой. (Главный вызов пустой ggplot)
Преимущество заключается в том, что использование синтаксиса ggplot делает управление цветом / заливкой c очень простым, и вы также можете очень легко настроить толщину линии и размер текста.
Что касается аббревиатур штатов, я использовал только первые буквы - возможно, это не официальная аббревиатура. Наверняка существует какой-то вектор, как это легко преобразовать.
library(usmap)
library(tidyverse)
us <- usmap::us_map()
region <- str_to_title(region)
share_df <- data.frame(region, share)
us_val <-
left_join(us, share_df, by = c("full" ="region"))
#> Warning: Column `full`/`region` joining character vector and factor, coercing
#> into character vector
us_centroids <-
us_val %>%
group_by(full) %>%
summarise(centroid.x = mean(range(x)),
centroid.y = mean(range(y)),
label = unique(toupper(str_sub(full,1,2))),
share = unique(share))
ggplot() +
geom_polygon(data = us_val,
aes(x,y, group = group, fill = share > 3),
color = "black",
size = .1) +
geom_text(data = us_centroids,
aes(centroid.x, centroid.y, label = paste(label, "\n", share)),
size = 5/14*8) +
scale_fill_brewer(name = "State Share",
palette = "Blues",
labels = c(`TRUE`="More than 3",`FALSE`="Less than 3")) +
theme_void()
Создано 06.05.2020 пакетом REPEX (v0.3.0)
update Сказав, что с сокращением - проверьте? Datasets :: state. Он содержит эти сокращения (state.abb
) и названия состояний (state.name
). Он также содержит данные о центроидах (state.center
). Итак, много данных уже встроено :)
Data
region = c("alabama", "alaska", "arizona", "arkansas",
"california", "colorado", "connecticut", "delaware", "district of columbia",
"florida", "georgia", "hawaii", "idaho", "illinois", "indiana",
"iowa", "kansas", "kentucky", "louisiana", "maine", "maryland",
"massachusetts", "michigan", "minnesota", "mississippi", "missouri",
"montana", "nebraska", "nevada", "new hampshire", "new jersey",
"new mexico", "new york", "north carolina", "north dakota", "ohio",
"oklahoma", "oregon", "pennsylvania", "rhode island", "south carolina",
"south dakota", "tennessee", "texas", "utah", "vermont", "virginia",
"washington", "west virginia", "wisconsin", "wyoming")
share = c(1.15, 0.11, 6.21, 2.41, 8.42, 13.57, 3.57, 4.55, 7.08, 9.42, 5.21,
0.108, 9.09, 2.56, 4.51, 9.65, 6.76, 3.54, 0.17, 1.99, 6.66,
3.88, 7.31, 4.86, 4.85, 2.39, 0.25, 0.05, 0.21, 0.11, 3.86, 0.05,
7.31, 1.91, 0.41, 4.55, 0.002, 2.65, 3.14, 0.71, 1.94, 0.13,
2.2, 12.65, 0.05, 0.074, 5.79, 7.5, 0.12, 2.6, 0.33)