您的问题与链接的问题几乎相同,除了您的数据不存在已存在的小写州名称这一事实。
library(tidyverse)
library(fiftystater)
library(viridis)
#> Loading required package: viridisLite
使用内置数据集构建示例数据集。您不需要执行此部分,只需调用您的值即可绘制tbl
tbl <- state.x77 %>%
as_tibble(rownames = "state") %>%
bind_cols(state_name = state.abb) %>%
rename(value_x = Income) %>%
select(state_name, value_x)
创建一个将州名称与州缩写相关联的表:
state_abbs <- tibble(state = str_to_lower(state.name), abb = state.abb)
Use left_join
将完整的州名连接到只有缩写的数据表中:
tbl_m <- left_join(tbl, state_abbs, by = c("state_name" = "abb")) %>%
rename(id = state)
然后基本上复制示例fiftystater
or 从链接问题的答案 https://stackoverflow.com/a/46865009/7028459。这里第一个关键部分是geom_map
,这需要你使用选项map = fifty_states
where fifty_states
数据表是来自fiftystater
,并且还供应aes(map_id = id)
这样它就知道哪组点对应于数据中的哪些值。第二个关键部分是geom_text
,这会在您指定的坐标处添加所需的文本。在这里,我们创建一个数据框,使坐标成为每个州的纬度或经度的平均值fifty_states
,然后将其加入到数据中tbl_m
。剩下的就是格式化了!
ggplot(tbl_m) +
geom_map(map = fifty_states, aes(map_id = id, fill = value_x)) +
expand_limits(x = fifty_states$long, y = fifty_states$lat) +
coord_map() +
geom_text(
data = fifty_states %>%
group_by(id) %>%
summarise(lat = mean(c(max(lat), min(lat))),
long = mean(c(max(long), min(long)))) %>%
mutate(state = id) %>%
left_join(tbl_m, by = c("state" = "id")),
aes(x = long, y = lat, label = value_x )
) +
scale_fill_viridis() +
scale_x_continuous(breaks = NULL) +
scale_y_continuous(breaks = NULL) +
labs(x = "", y = "") + theme(legend.position = "bottom",
panel.background = element_blank())
#> Warning: Removed 1 rows containing missing values (geom_text).
创建于 2018-02-16代表包 http://reprex.tidyverse.org(v0.2.0)。