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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:10:37