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

在R的Plotly中启用hovermode='x',如何隐藏y=0或NA的hoverinfo?

问题描述

我正在使用R/Plotly创建堆叠填充面积图,汇总多个不同时间开户、余额有时为0的账户,简化示例代码如下:

df <- data.frame(cbind(
    year <- c("2022-01-01","2022-02-01","2022-03-01","2022-04-01","2022-05-01","2022-06-01","2022-07-01","2022-08-01","2022-09-01","2022-10-01","2022-11-01","2022-12-01"),
    x <- c(NA,NA,NA,1,2,3,2,3,4,5,3,4),
    y <- c(1,2,2,1,2,4,3,2,NA,NA,NA,NA),
    z <- c(NA,NA,NA,1,2,5,6,5,5,NA,NA,NA)
)) %>%
    setNames(c("DATE","X","Y","Z")) %>%
    mutate(DATE = as.Date(DATE, format = "%Y-%m-%d")) %>%
    mutate(X = as.numeric(X), Y = as.numeric(Y), Z = as.numeric(Z)) %>%
    pivot_longer(., -DATE, names_to = "LEGEND", values_to = "QUANTITY") %>%
    mutate(LEGEND = factor(LEGEND, levels = c("X","Y","Z")))

我偏好使用hovermode = "x"参数同时对比某一时刻的所有数值,但当账户余额为NA时,悬停仍会显示y = 0的hoverinfo,大量账户时会造成界面杂乱。绘图代码如下:

dfplot <- plot_ly(data = df, x = ~DATE, y = ~QUANTITY, color = ~LEGEND, type = "scatter", mode = "none", stackgroup = "one", fill = "tonexty") %>%
    layout(
        autosize = TRUE,
        yaxis = list(range = c(0,15)),
        hovermode = "x",
        showlegend = TRUE
    )
dfplot

我已实现跳过整个trace的hoverinfo,且简单scatter trace可忽略y=0,但堆叠填充面积图无法实现该效果。请问如何去除这些多余提示,或条件跳过y=0/NA的hoverinfo?

解决方案

方法1:自定义hover文本过滤无效值

通过为每个数据点生成自定义悬停文本,仅保留非NA且非0的数值,再设置hoverinfo = "text"只显示有效内容。同时改用hovermode = "x unified"将同日期的有效提示合并展示,减少杂乱感。修改后的代码如下:

# 先添加自定义hover文本列
df <- df %>%
    mutate(
        hover_text = ifelse(is.na(QUANTITY) | QUANTITY == 0, "", paste0(LEGEND, ": ", QUANTITY))
    )

# 绘制堆叠面积图
dfplot <- plot_ly(data = df, x = ~DATE, y = ~QUANTITY, color = ~LEGEND, 
                  type = "scatter", mode = "none", stackgroup = "one", fill = "tonexty",
                  text = ~hover_text, hoverinfo = "text") %>%
    layout(
        autosize = TRUE,
        yaxis = list(range = c(0,15)),
        hovermode = "x unified",
        showlegend = TRUE
    )
dfplot

方法2:按账户拆分trace精确控制hover行为

针对每个账户单独创建trace,仅在对应日期有有效数值时生成悬停信息,否则隐藏。这种方式适合账户数量较多的场景,灵活性更强:

# 按账户分组拆分数据
df_list <- split(df, df$LEGEND)

# 初始化绘图对象
dfplot <- plot_ly()

# 遍历每个账户添加trace
for (account in names(df_list)) {
    account_data <- df_list[[account]]
    # 生成过滤后的hover文本
    account_data <- account_data %>%
        mutate(hover_text = ifelse(is.na(QUANTITY) | QUANTITY == 0, "", paste0(account, ": ", QUANTITY)))
    
    dfplot <- dfplot %>%
        add_trace(
            data = account_data,
            x = ~DATE,
            y = ~QUANTITY,
            name = account,
            type = "scatter",
            mode = "none",
            stackgroup = "one",
            fill = "tonexty",
            text = ~hover_text,
            hoverinfo = "text"
        )
}

# 设置布局
dfplot <- dfplot %>%
    layout(
        autosize = TRUE,
        yaxis = list(range = c(0,15)),
        hovermode = "x unified",
        showlegend = TRUE
    )
dfplot

关键注意点

  • 堆叠面积图中Plotly会自动将NA值视为0计算堆叠高度,因此直接用NA无法隐藏悬停提示,必须通过自定义文本过滤无效值。
  • hovermode = "x unified"比原生的hovermode = "x"更整洁,所有有效信息会合并到一个悬浮框中,避免多个框重叠干扰。

内容的提问来源于stack exchange,提问作者matogoro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:36:20