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

如何为ggplotly生成的树状图轴标签添加悬停文本(显示聚类变量对应值)

如何为ggplotly生成的树状图轴标签添加悬停文本(显示聚类变量对应值)

我之前也碰到过类似的困扰——用ggdendro做的树状图转成ggplotly后,直接给轴标签加hover文本确实不太容易,因为轴标签属于绘图的轴属性,不是常规的ggplot图层元素,plotly没法直接识别绑定tooltip。不过我们可以通过添加隐形点图层的方式绕开这个问题,把需要显示的变量信息绑定到对应轴标签位置的隐形点上,这样鼠标悬停到标签附近时就能触发hover提示。

下面是针对你给出的示例代码修改后的完整解决方案:

# Load required libraries
library(cluster)  # For clustering
library(ggplot2)  # For visualization
library(ggdendro) # For dendrogram conversion
library(plotly)   # For interactive plots

# Example data
my_data <-  data.frame(
  Name = rep(c("Name1", "Name2", "Name3", "Name4", "Name5", "Name6", "Name7", "Name8", "Name9", "Name10"), times = 1),
  Var1 = rep(c(1, 2, 3, 4, 5), times = 10),
  Var2 = rep(c(20, 25, 50, 90,100), times = 10)
)

# Extract features for clustering
features <- my_data[, c("Var1", "Var2")]

# Compute distance matrix
distance_matrix <- dist(features)

# Perform hierarchical clustering
hierarchical_result <- hclust(distance_matrix)

# Custom function to create x axis labels labels for the dendrogram
create_x_labels <- function(hc, data) {
  labels <- data$Name[hc$order]
  return(labels)
}

# Create the dendrogram plot using ggdendro
dendrogram_labels <- create_x_labels(hierarchical_result, my_data)
dendro <- as.dendrogram(hierarchical_result)
dendro <- dendro %>% set("labels", value = dendrogram_labels)  # Set the labels

# --------------------------
# 关键修改部分:整理标签对应的变量数据,添加隐形点图层
# --------------------------
# 按聚类后的顺序整理每个标签对应的Var1/Var2值,并分配x轴位置
label_data <- my_data[hierarchical_result$order, ]
label_data$x_pos <- seq_along(label_data$Name) # 每个标签对应x轴上的1到n的位置

# 生成带隐形点的ggplot树状图
dendro_plot <- ggdendro::ggdendrogram(dendro, rotate = FALSE) +
  # 添加完全透明的点,y轴位置设为负数(低于树状图的底部)
  geom_point(data = label_data, 
             aes(x = x_pos, y = -0.5,
                 # 定义hover要显示的内容,用<br>换行
                 text = paste("Name:", Name, "<br>",
                             "Var1:", Var1, "<br>",
                             "Var2:", Var2)),
             alpha = 0) # alpha=0让点完全隐形,不影响原图

# Convert the ggplot dendrogram to a plotly interactive plot
p <- ggplotly(dendro_plot, tooltip = "text") %>%
  layout(
    xaxis = list(title = "ID", ticktext = dendrogram_labels),
    yaxis = list(title = "Distance", 
                 range = c(-1, max(hierarchical_result$height))) # 调整y轴范围,确保隐形点在plotly的识别范围内
  )

p

核心思路解释:

  1. 整理标签数据:我们先把原始数据按聚类后的顺序(hierarchical_result$order)重新排列,给每个标签分配对应的x轴位置(从1到样本数)。
  2. 添加隐形点:用geom_point添加一个完全透明的点图层,点的x位置和轴标签对齐,y位置设为负数(放在树状图下方),同时把需要显示的Var1、Var2信息打包到text美学属性里。
  3. plotly识别hover:转成ggplotly时,指定tooltip="text",这样鼠标悬停到轴标签附近时,就会触发隐形点的hover提示,显示我们预设的变量信息。

这个方法既不会破坏原树状图的样式,又能完美实现你需要的hover功能,亲测有效哦!

备注:内容来源于stack exchange,提问作者FST

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 15:59:29