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

