ggplot+geom_polygon绘制地图添加交互标签报错求助
问题解决:修复ggplot错误并添加交互式悬停标签
一、先修复现有代码的报错
你遇到的Error in geom_point(): ! mapping must be created by aes()错误,是因为geom_point的参数传递顺序不对。ggplot的geom函数默认第一个参数是映射(mapping),第二个才是数据集(data),你直接把pop_usa放在第一个位置,被当成了映射对象,导致报错。
修正后的静态代码(先解决报错,再处理交互):
# 加载必要包 library(ggplot2) scaling_map <- ggplot(pop_usa, aes(long, lat)) + geom_polygon(aes(group = group, fill = estimated_pop_2020), color = "black") + theme( axis.title.x = element_blank(), axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.title.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank(), plot.title = element_text(face = "bold", hjust = 0.5) ) + ggtitle("Estimated population by state") + scale_fill_gradient(name = "Estimated population (log10)", low = "#FFFFCC", high = "#336600") + # 修正geom_point的参数:明确指定data geom_point(data = pop_usa, aes(x = long, y = lat, group = group, size = values)) + geom_text(data = pop_usa, aes(x = long, y = lat, group = group, label = state), size = 3, hjust = 0, vjust = -1) + coord_map() # 查看静态图 print(scaling_map)
二、添加鼠标悬停显示州名的交互功能
静态的geom_text只能固定显示文字,无法实现鼠标悬停触发的交互效果,推荐两种实现方式:
方案1:用plotly转换ggplot为交互式图表
plotly可以快速将ggplot对象转为交互式,支持悬停显示自定义内容:
# 安装并加载plotly install.packages("plotly") library(plotly) # 修正代码并添加悬停文本 scaling_map <- ggplot(pop_usa, aes(long, lat)) + geom_polygon(aes(group = group, fill = estimated_pop_2020, text = paste("州名:", state, "\n2020预估人口:", estimated_pop_2020)), color = "black") + theme( axis.title.x = element_blank(), axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.title.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank(), plot.title = element_text(face = "bold", hjust = 0.5) ) + ggtitle("Estimated population by state") + scale_fill_gradient(name = "Estimated population (log10)", low = "#FFFFCC", high = "#336600") + coord_map() # 转为交互式图表,悬停时显示州名和人口 ggplotly(scaling_map, tooltip = "text")
方案2:用ggiraph创建原生交互式多边形
ggiraph专门用于ggplot的交互式扩展,更适合自定义交互细节:
# 安装并加载ggiraph install.packages("ggiraph") library(ggiraph) # 使用交互式多边形图层 scaling_map <- ggplot(pop_usa, aes(long, lat)) + geom_polygon_interactive( aes( group = group, fill = estimated_pop_2020, tooltip = paste("州名:", state, "\n2020预估人口:", estimated_pop_2020), data_id = state ), color = "black" ) + theme( axis.title.x = element_blank(), axis.text.x = element_blank(), axis.ticks.x = element_blank(), axis.title.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank(), plot.title = element_text(face = "bold", hjust = 0.5) ) + ggtitle("Estimated population by state") + scale_fill_gradient(name = "Estimated population (log10)", low = "#FFFFCC", high = "#336600") + coord_map() # 渲染交互式图表 ggiraph(code = print(scaling_map), hover_css = "fill:red;")
内容的提问来源于stack exchange,提问作者sikimimi
相关产品推荐
相关产品推荐

