Plotly中添加静态多边形可行吗?相关问题求助
解决Plotly散点图的悬停遮挡与多边形持久显示问题
我来帮你搞定这两个问题,先拆解下根源,再给你修正后的代码:
问题背后的原因
- 悬停信息被遮挡:你添加的多边形默认处在散点图层的上方,哪怕设置了透明度,Plotly的悬停事件还是会优先被顶层的多边形捕获(而你给多边形设了
hoverinfo="none"),导致散点的悬停信息出不来。 - 多边形随选择消失:当你选择散点分组时,Plotly会默认对所有trace应用选择状态,包括多边形,默认逻辑会隐藏未选中的trace,所以多边形跟着不见了。
修正后的完整代码
library(plotly) data("iris") xsq <- function(x) sqrt(x) # 拆分两个多边形的坐标,让代码更清晰 poly1_x <- c(seq(0,10,0.001), 0, 0) poly1_y <- c(xsq(poly1_x[1:length(seq(0,10,0.001))]), xsq(max(poly1_x)), 0) poly2_x <- c(0.5,10,10,0.5) poly2_y <- c(0,2,0,0) # 构建图表 plot_ly() %>% # 添加第一个多边形,强制放在散点底层 add_polygons( x = poly1_x, y = poly1_y, alpha = 0.1, opacity = 0.1, hoverinfo = "none", color = I("red"), showlegend = FALSE, # 固定选择/未选择状态的透明度,避免随散点选择消失 selected = list(opacity = 0.1), unselected = list(opacity = 0.1), layer = "below" ) %>% # 添加第二个多边形,同样设置底层和固定显示状态 add_polygons( x = poly2_x, y = poly2_y, alpha = 0.1, opacity = 0.1, hoverinfo = "none", color = I("blue"), showlegend = FALSE, selected = list(opacity = 0.1), unselected = list(opacity = 0.1), layer = "below" ) %>% # 添加散点图层,默认在顶层 add_markers( x = iris$Sepal.Length, y = iris$Sepal.Width - 2, opacity = 1, alpha = 1, color = iris$Species, hoverinfo = "text", text = iris$Species )
关键修改说明
- 强制图层顺序:给每个多边形加上
layer = "below",让它们固定在所有散点的下方,这样散点的悬停事件不会被多边形拦截。 - 移除冗余底层trace:原来的
plot_ly(x = x, y = y)创建了一个多余的底层散点trace,现在改成空的plot_ly(),避免干扰图层结构。 - 锁定多边形显示状态:通过
selected和unselected参数,让多边形在散点被选择/取消选择时,透明度保持不变,确保它始终显示。 - 拆分坐标定义:把两个多边形的坐标分开写,代码逻辑更清晰,不容易搞混。
这样修改后,你就能正常查看所有散点的悬停信息,而且不管怎么选择散点分组,两个多边形都会一直留在图上啦。
内容的提问来源于stack exchange,提问作者tpbilton
相关产品推荐
相关产品推荐

