在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
相关产品推荐
相关产品推荐

