R语言绘制美国各州热力图报错及实现方案咨询
问题解答
3. 代码运行错误原因及修复
你的代码错误核心是nurses数据集的State列包含非美国本土州/特区的条目:2020年的汇总数据里包含全国汇总行「United States」以及部分海外领地,这些条目和usmap内置的statepop数据集匹配时会生成fips为NA的行,plot_usmap无法处理这些无对应空间坐标的行就会报错。
修复只需要在合并数据后过滤掉fips为空的行即可,修复后可运行代码如下:
library(usmap) library(tidyverse) nurses <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-10-05/nurses.csv') plot_data <- nurses %>% filter(Year == 2020) %>% select(State, `Total Employed RN`) %>% rename("Total_Employed" = 2) statepop <- statepop %>% rename(State = full) merged_df <- left_join(plot_data, statepop, by = "State") %>% filter(!is.na(fips)) # 新增过滤行,删除无匹配的无效数据 # 现在可以正常出图 plot_usmap(data = merged_df, values = "Total_Employed", color = "blue") + scale_fill_continuous(low = "white", high = "blue", name = "注册护士从业人数") + theme_minimal()
1. USMAP是不是绘制美国州级热力图的最优工具
- 对常规快速出图需求来说,USMAP是性价比很高的选择:它内置了适配美国地图的投影,自动平移阿拉斯加、夏威夷的位置,无需自行处理空间文件、坐标校准,几行代码就能出合规的美国热力图,适合入门和快速分析场景。
- 但如果有高度自定义需求(比如叠加其他空间图层、调整边界精度、使用特殊投影),USMAP的灵活性不足,不算最优方案。
2. 基于ggplot2的替代实现方案
不使用usmap包的前提下,有两种常见的ggplot2原生实现方案:
方案1:使用ggplot2内置的州边界数据
ggplot2自带map_data()函数可以直接调用美国州边界坐标,匹配数据后用geom_polygon绘制,示例代码:
library(tidyverse) # 读取州边界数据,state列是小写的州名 state_bound <- map_data("state") # 处理业务数据,把州名转小写方便匹配 plot_data <- nurses %>% filter(Year == 2020) %>% select(State, `Total Employed RN`) %>% rename(Total_Employed = 2) %>% mutate(region = str_to_lower(State)) # 匹配后绘图 left_join(state_bound, plot_data, by = "region") %>% ggplot(aes(x = long, y = lat, group = group, fill = Total_Employed)) + geom_polygon(color = "white") + scale_fill_gradient(low = "white", high = "blue") + coord_map("albers", lat0 = 39, lat1 = 45) + # 设置适配美国的阿尔伯斯投影 theme_void()
方案2:使用sf包读取官方空间文件
如果需要更高精度的边界或者更多自定义能力,可以下载美国人口普查局发布的官方shp边界文件,用sf包读取为sf对象后,直接用ggplot2的geom_sf()图层绘制,灵活性最高。
内容的提问来源于stack exchange,提问作者Indescribled
相关产品推荐
相关产品推荐

