【问题标题】:Plot a numerical values in United states map based on Abbreviated state names根据缩写的州名在美国地图中绘制数值
【发布时间】:2018-02-16 17:43:23
【问题描述】:

我有一个包含所有状态的数据如下。在这里提供一个样本,

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 帖子中获取了这张图片。

【问题讨论】:

  • 你需要获取每个州的经纬度坐标
  • 如果您能向我们展示您的尝试/具体挑战是什么,这会有所帮助 - 请参阅 how to ask

标签: r ggplot2


【解决方案1】:

您的问题与链接的问题几乎相同,只是您的数据中没有小写的州名称。

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)

然后基本上从fiftystaterfrom the answer to the linked question 复制示例。这里第一个关键部分是geom_map,这需要你使用选项map = fifty_states,其中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).

reprex package (v0.2.0) 于 2018 年 2 月 16 日创建。

【讨论】:

  • 非常感谢您提供的简洁解决方案。当我尝试加载“viridis”包时出现此错误。错误:“名称空间:viridisLite”未导出对象“cividis”错误:“viridis”的包或名称空间加载失败。我用谷歌搜索并试图修复错误。但它没有用。所以我改用“mapproj”包。它工作得很好。感谢您花时间解释这种方法:)
  • 我注意到我的数据也将“DC”(华盛顿特区)列为州之一。但是“DC”不是一个州,并且在五十州不可用。但我仍然想绘制这个。是否有任何解决方法可以将 DC 添加到此情节?
  • Viridis 只是一个色标,并不重要。对于 DC idk,由于面积太小,您会期望如何绘制它;你希望它看起来像什么??
  • 我已经修改了绘图,使其显示状态名称和 value_x。我希望将 DC 包含在其中,这样我就不会错过任何信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多