我的数据如下,包含所有状态。在这里提供样本,
state_name value_x
AL 250
AK 900
.
.
MT 1000
NJ 10000
.
WY 500
现在我需要根据州缩写在美国地图中绘制这些数字(value_x)。
我尝试在线阅读这个包fiftystater
。但我没有在任何地方绘制这个。
我也读了这篇stackoverflow文章。但我不知道如何申请我的特定数据集。
How to map all the states of US using R with the number of crimes occurred in each state?
请帮忙!我希望将我的图形可视化。我从stackoverflow帖子中获取了这张图片。
答案 0 :(得分:3)
您的问题几乎与链接的问题完全相同,只是您的数据没有已经存在的小写状态名称。
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)
使用left_join
将完整的州名称加入到只有缩写的数据表中:
tbl_m <- left_join(tbl, state_abbs, by = c("state_name" = "abb")) %>%
rename(id = state)
然后基本上从fiftystater
或from the answer to the linked question复制示例。这里的第一个关键部分是geom_map
,您需要使用选项map = fifty_states
,其中fifty_states
是来自fiftystater
的数据表,同时也提供aes(map_id = id)
所以它知道哪组点对应于数据中的哪些值。第二个关键部分是geom_text
,它会在您指定的坐标处添加所需的文本。在这里,我们创建一个数据框,使坐标成为fifty_states
中每个状态的lat或long的平均值,然后将其连接到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).
由reprex package(v0.2.0)创建于2018-02-16。