R语言制作交互式美国薪资Choropleth地图技术求助
解决R语言制作美国薪资分级统计图的问题
我来帮你搞定这个美国薪资分级统计图的问题!先从你的数据和两种方法的问题说起:
第一步:先清理你的数据
你提供的stateDF里有两个影响地图生成的问题:
- 阿拉斯加州(AK)有两条重复记录,同一个州不能对应多个中位数薪资值,咱们先对重复州的薪资取平均值
- 出现了
DL,应该是华盛顿特区(DC)的拼写错误,需要修正
先执行这段数据清理代码:
library(dplyr) # 修正拼写错误 stateDF <- stateDF %>% mutate(State = ifelse(State == "DL", "DC", State)) # 对重复的州取中位数薪资的平均值 stateDF_clean <- stateDF %>% group_by(State) %>% summarise(Median = mean(Median, na.rm = TRUE)) %>% ungroup()
方法一:ggplot + plotly 实现交互式悬停地图
你的ggplot代码能画出基础地图,但没关联薪资数据也没悬停效果,咱们把数据关联起来,再转成交互式:
library(ggplot2) library(plotly) library(maps) # 获取美国州地图数据,把州名转成缩写方便关联 states_map <- map_data("state") %>% mutate(State = state.abb[match(tolower(region), tolower(state.name))]) # 合并地图数据和清理后的薪资数据 map_data_merged <- left_join(states_map, stateDF_clean, by = "State") # 绘制ggplot地图 p <- ggplot(map_data_merged, aes(x = long, y = lat, group = group)) + geom_polygon(aes(fill = Median), color = "white") + coord_fixed(1.3) + scale_fill_viridis_c(name = "中位数薪资", option = "magma", direction = -1) # 颜色越深薪资越高 theme_void() # 一键去掉所有坐标轴元素,比你之前的多个theme设置更简洁 # 转成plotly交互式地图,添加悬停文本 ggplotly(p, tooltip = c("State", "Median")) %>% layout(geo = list(scope = "usa"))
这段代码的关键点:
- 把地图数据的州名转换成缩写,和你的
stateDF_clean关联 - 用
scale_fill_viridis_c设置颜色渐变,direction=-1实现颜色越深薪资越高 theme_void()替代你之前一堆的theme设置,更简洁ggplotly转成交互式,tooltip指定悬停时显示的内容
方法二:纯plotly实现正确的分级统计图
你之前的plotly代码没出图,核心原因是数据有重复的州,用清理后的数据重新写:
library(plotly) plot_ly( data = stateDF_clean, type = "choropleth", locations = ~State, locationmode = "USA-states", z = ~Median, colorscale = "Viridis", reversescale = TRUE, # 反转颜色,让薪资越高颜色越深 text = ~paste("州名:", State, "<br>中位数薪资:", Median), # 自定义悬停文本 colorbar = list(title = "中位数薪资") ) %>% layout( geo = list(scope = "usa"), title = "美国各州中位数薪资分级统计图" )
这段代码的关键点:
- 使用清理后的无重复数据
stateDF_clean reversescale=TRUE实现颜色深浅和薪资高低对应text参数自定义悬停时显示的内容,更清晰
现在运行这两种方法的代码,应该就能得到你想要的:基础美国地图、悬停显示州名和中位数薪资、颜色越深薪资越高的分级效果啦!
内容的提问来源于stack exchange,提问作者Ellie
相关产品推荐
相关产品推荐

