在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
相关产品推荐
相关产品推荐

