ggplotly转换ggplot2图表时geom_text位置异常及tooltip冲突问题
解决ggplotly转换时geom_text位置偏移及tooltip冲突问题
问题重现
使用ggplot2绘制带geom_text的柱状图,通过ggplotly转换后,geom_text未遵循原ggplot中设置的位置;尝试用plotly::style(textposition = "top")修复文本位置,却导致tooltip被移到柱状图上方,出现功能冲突。
原代码:
library(data.table) library(tidyverse) url <- "https://raw.githack.com/fsbmat-ufv/stackExchange/main/df.csv" test <- fread(url) plot <- ggplot(test, aes(reorder(factor(UF), desc(Value)), y = Value, fill = UF, text = paste("UF: ",UF, "<br>", "Value: ",paste0("R$",formatC(1000000000*Value, digits = 2, big.mark=',', format = 'f'))))) + geom_col(show.legend = FALSE) + geom_text(aes(label=Value), position = position_dodge(width = 0.9), vjust = -0.5, size = 3) + xlab("Federal Unit") + ylab("Amount Received") + theme_light() plotly::ggplotly(plot, tooltip = "text")%>% plotly::layout(showlegend = FALSE)
转换后效果:
使用style后的代码:
plotly::ggplotly(plot, tooltip = "text")%>% plotly::style(textposition = "top") %>% plotly::layout(showlegend = FALSE)
效果(tooltip位置异常):
解决方案
核心思路是仅针对geom_text对应的trace设置textposition,避免影响tooltip的位置。ggplotly转换后,geom_text会生成类型为'text'的trace,我们可以筛选出这些trace单独设置属性:
p <- plotly::ggplotly(plot, tooltip = "text") %>% plotly::layout(showlegend = FALSE) # 遍历所有trace,仅对text类型的trace设置textposition for(i in seq_along(p$x$data)){ if(p$x$data[[i]]$type == "text"){ p$x$data[[i]]$textposition <- "top center" } } p
原理说明
- ggplotly会将ggplot中的不同图层转换为plotly的不同trace:
geom_col对应'bar'类型trace,geom_text对应'text'类型trace。 - 直接用
style(textposition = "top")会全局应用到所有trace,包括bar类型(影响tooltip位置);而通过遍历筛选text类型trace单独设置,只会修正文本位置,不会干扰tooltip的默认行为。
内容的提问来源于stack exchange,提问作者fsbmat
相关产品推荐
相关产品推荐

