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

解决ggiraph交互式地图中缺失数据及相同值区域hover联动高亮问题

解决ggiraph地图中相同值区域联动高亮的问题

你的问题根源在于**data_id = PlotVar**这个参数:所有拥有相同PlotVar值(包括NA)的自治市会被分配同一个data_id,ggiraph会把它们视为同一组,所以hover时会同时高亮。要解决这个问题,我们只需要给每个自治市分配唯一的data_id,并根据需求调整交互逻辑。

方案1:让无数据(NA)区域完全无交互(理想状态)

我们可以分两层绘制地图:一层是非交互式的无数据区域,一层是交互式的有数据区域,这样无数据区域不会响应hover事件。

library(ggiraph)
library(ggplot2)
library(swemaps)
library(dplyr)

# 准备数据
allMunicipalities <- levels(map_kn$knnamn)
dat <- data.frame(knnamn = allMunicipalities, PlotVar = NA, ttip = NA)
dat$PlotVar[45] <- 8.3
dat$ttip[45] <- "Finspång: 8.3"
dat$PlotVar[32] <- 7.2
dat$ttip[32] <- "Eda: 7.2"
dat$PlotVar[103] <- 11.9
dat$ttip[103] <- "Klippan: 11.9"

plotData <- left_join(map_kn, dat, by="knnamn")

# 绘制地图:先画无数据的非交互层,再画有数据的交互层
p <- ggplot() +
  # 无数据区域:非交互式,填充灰色
  geom_polygon(
    data = subset(plotData, is.na(PlotVar)),
    aes(x = ggplot_long, y = ggplot_lat, group = knkod),
    fill = "gray80", color = "white"
  ) +
  # 有数据区域:交互式,使用唯一的knkod作为data_id
  geom_polygon_interactive(
    data = subset(plotData, !is.na(PlotVar)),
    aes(
      x = ggplot_long, y = ggplot_lat, group = knkod,
      fill = PlotVar, tooltip = ttip, data_id = knkod
    )
  ) +
  coord_equal() +
  scale_fill_viridis_c(na.value = "gray80") # 统一NA的填充色

# 查看结果
girafe(ggobj = p)

方案2:保留无数据区域的交互,hover时显示“无数据”

如果需要无数据区域也能响应hover,仅高亮当前区域并显示提示,只需要给每个自治市分配唯一的data_id(比如用knkod,每个自治市的代码是唯一的),同时给NA区域设置对应的tooltip:

library(ggiraph)
library(ggplot2)
library(swemaps)
library(dplyr)

# 准备数据
allMunicipalities <- levels(map_kn$knnamn)
dat <- data.frame(knnamn = allMunicipalities, PlotVar = NA, ttip = NA)
dat$PlotVar[45] <- 8.3
dat$ttip[45] <- "Finspång: 8.3"
dat$PlotVar[32] <- 7.2
dat$ttip[32] <- "Eda: 7.2"
dat$PlotVar[103] <- 11.9
dat$ttip[103] <- "Klippan: 11.9"

# 给无数据区域设置tooltip
dat$ttip <- ifelse(is.na(dat$PlotVar), "无数据", dat$ttip)

plotData <- left_join(map_kn, dat, by="knnamn")

# 绘制地图:用knkod作为唯一的data_id
p <- ggplot(plotData, aes(x = ggplot_long, y = ggplot_lat)) +
  geom_polygon_interactive(
    aes(
      fill = PlotVar, group = knkod,
      tooltip = ttip, data_id = knkod
    )
  ) +
  coord_equal() +
  scale_fill_viridis_c(na.value = "gray80")

# 查看结果
girafe(ggobj = p)

关键原理

data_id是ggiraph用来识别交互组的参数,只要每个区域的data_id唯一,hover时就只会触发当前区域的高亮和tooltip。而原来的代码用PlotVar作为data_id,导致所有NA区域共享同一个ID,从而产生联动高亮的问题。

内容的提问来源于stack exchange,提问作者Vilhelm Agdur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:22:28