ggplotly使用美学映射时悬停文本与对应点不匹配的解决方法
问题解决:保留颜色美学映射时设置正确的ggplotly悬停文本
问题场景
要制作供学生查看作业的交互式图表,用ggplot创建带Priority颜色映射的散点图后,通过ggplotly+style设置自定义悬停文本时,出现悬停文本与对应数据点不匹配的问题(比如图表显示剩余5天,悬停却显示30天)。移除colour=Priority美学映射后问题消失,但需要保留这个颜色分组效果。
问题原因
当使用colour=Priority时,ggplotly会将数据按Priority的不同取值拆分成多个独立的trace(每个优先级对应一个trace)。而直接给style()传入按原始数据行顺序生成的labels,会按trace的顺序依次赋值,而非原始数据点的顺序,导致文本和点错位。
解决方案
方法一:在ggplot的美学映射中直接定义悬停文本(推荐)
提前在数据框中生成悬停文本列,然后在ggplot的aes()中加入text参数,ggplotly会自动将该文本与对应数据点绑定,无需额外使用style()。
修改后的完整代码:
# 创建数据框 Priority <- c("High","High","Low","Medium","Low") Days_Until_Due <- c(30, 28, 5, 15, 1) Subject <- c("History", "English","English","Math","History") Assignment_ID <- c("hs12","eng23","en25","mat7","hs33") df <- data.frame(Priority, Days_Until_Due, Subject, Assignment_ID) # 生成悬停文本列 df$hover_text <- paste("Priority:", df$Priority, "<br>", "Days Until Due:", df$Days_Until_Due, "<br>", "Subject:", df$Subject, "<br>", "ID:", df$Assignment_ID) # 创建ggplot图表,加入text美学映射 agenda <- df %>% ggplot(aes(x=Assignment_ID, y=Days_Until_Due, colour=Priority, text=hover_text)) + geom_point() + xlab("Assignment") + ylab("Days Until Due") # 转换为交互式图表,自动使用hover_text作为悬停内容 ggplotly(agenda)
方法二:按trace顺序匹配悬停文本(不推荐,较繁琐)
如果一定要用style(),需要先明确ggplotly生成的trace顺序,再对应调整labels的顺序。比如本例中,trace顺序是High、Low、Medium,对应的原始数据行是[1,2]、[3,5]、[4],所以需要把labels按这个顺序重新排列后传入style():
# 原代码中生成labels后,按trace顺序重新排列 trace_order_labels <- c(labels[c(1,2)], labels[c(3,5)], labels[4]) # 应用到ggplotly ggplotly(agenda) %>% style(text = trace_order_labels)
这种方法需要手动对应trace和数据行的关系,当数据变化时需要重新调整,不如方法一灵活。
内容的提问来源于stack exchange,提问作者Kat
相关产品推荐
相关产品推荐

