You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言中绘制美国各州观测值频率地图的问题求助

美国各州观测频率地图绘制问题

我希望绘制数据中美国各州的观测值频率地图,以下是我的数据集:

small_df <- structure(list(fips = c("02", "04", "05", "06", "08", "13", "17", 
"18", "19", "20", "23", "24", "26", "27", "31", "34", "36", "37", 
"39", "41", "42", "47", "48", "49", "51", "55"), Freq = c(1L, 
3L, 1L, 3L, 2L, 1L, 4L, 9L, 3L, 1L, 1L, 1L, 36L, 2L, 1L, 1L, 
4L, 4L, 7L, 1L, 10L, 1L, 2L, 1L, 1L, 7L), statenames = c("Alaska", 
"Arizona", "Arkansas", "California", "Colorado", "Georgia", "Illinois", 
"Indiana", "Iowa", "Kansas", "Maine", "Maryland", "Michigan", "Minnesota", 
"Nebraska", "New Jersey", "New York", "North Carolina", "Ohio", "Oregon", 
"Pennsylvania", "Tennessee", "Texas", "Utah", "Virginia", "Wisconsin"), 
state.abb = c("AK", "AZ", "AR", "CA", "CO", "GA", "IL", "IN", "IA", "KS", "ME", 
"MD", "MI", "MN", "NE", "NJ", "NY", "NC", "OH", "OR", "PA", "TN", "TX", "UT", "VA", "WI"), 
states = c("alaska", "arizona", "arkansas", "california", "colorado", "georgia", 
"illinois", "indiana", "iowa", "kansas", "maine", "maryland", "michigan", "minnesota", 
"nebraska", "new jersey", "new york", "north carolina", "ohio", "oregon", "pennsylvania", 
"tennessee", "texas", "utah", "virginia", "wisconsin")), row.names = c(2L, 
3L, 4L, 5L, 6L, 11L, 14L, 15L, 16L, 17L, 20L, 21L, 23L, 24L, 28L, 31L, 33L, 34L, 
36L, 38L, 39L, 43L, 44L, 45L, 47L, 50L), class = "data.frame")

我运行了以下代码:

library(maps)
library(maptools)
library(sp)

mapUSA <- map('state',  fill = TRUE,  plot = FALSE)
nms <- sapply(strsplit(mapUSA$names,  ':'),  function(x)x[1])
USApolygons <- map2SpatialPolygons(mapUSA,  IDs = nms,  CRS('+proj=longlat'))

idx <- match(unique(nms),  small_df$states)
dat2 <- data.frame(value = idx, state = unique(nms))
row.names(dat2) <- unique(nms)
USAsp <- SpatialPolygonsDataFrame(USApolygons,  data = dat2)

spplot(USAsp['value'])

但生成的图像不正确,颜色条显示的是州名匹配的索引值,而非我需要的Freq列观测频率值。我希望颜色条能对应数据中每个州的观测频率,尝试过多个包,这个是最接近需求的,也愿意尝试更简便的工具包!


解决方案

方案一:修复原有sp/maptools代码

问题出在dat2的value列用了匹配索引而非实际的Freq值,修改后代码如下:

library(maps)
library(maptools)
library(sp)

mapUSA <- map('state', fill = TRUE, plot = FALSE)
nms <- sapply(strsplit(mapUSA$names, ':'), function(x)x[1])
USApolygons <- map2SpatialPolygons(mapUSA, IDs = nms, CRS('+proj=longlat'))

# 匹配各州对应的Freq值,无数据的州设为NA
idx <- match(unique(nms), small_df$states)
dat2 <- data.frame(
  Freq = ifelse(is.na(idx), NA, small_df$Freq[idx]),
  state = unique(nms)
)
row.names(dat2) <- unique(nms)
USAsp <- SpatialPolygonsDataFrame(USApolygons, data = dat2)

# 绘制带正确颜色条的地图
spplot(USAsp['Freq'], 
       main = "美国各州观测频率地图",
       col.regions = rev(heat.colors(10)), # 渐变颜色
       at = seq(0, max(small_df$Freq, na.rm = TRUE), length.out = 11), # 颜色区间匹配Freq范围
       col = "white") # 州边界设为白色

方案二:用ggplot2快速实现(更简便)

ggplot2配合maps包代码更简洁,可视化效果更灵活:

library(ggplot2)
library(maps)

# 获取美国州地图的经纬度数据
state_map <- map_data("state")

# 合并地图数据与观测数据,自动匹配州名
merged_data <- merge(state_map, small_df, by.x = "region", by.y = "states", all.x = TRUE)

# 绘制地图
ggplot(merged_data, aes(x = long, y = lat, group = group, fill = Freq)) +
  geom_polygon(color = "white") + # 绘制州多边形,边界白色
  coord_map("albers", lat0 = 39, lat1 = 45) + # 采用Albers投影,优化美国地图显示
  scale_fill_gradientn(
    colors = rev(heat.colors(10)), # 从低到高的渐变颜色
    na.value = "lightgray", # 无数据的州显示浅灰色
    name = "观测频率" # 颜色条标题
  ) +
  labs(title = "美国各州观测频率地图") +
  theme_void() # 移除多余的坐标轴、网格

这个方案自动处理州名匹配,无数据的州会被标记为浅灰色,颜色条直接对应Freq值,可读性更强。


内容的提问来源于stack exchange,提问作者C J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:24:53