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

如何为echarts4r箱形图tooltip添加离群点自定义悬浮信息

解决方案

e_boxplot 内置的离群点渲染逻辑不会携带原始数据集的自定义字段,因此无法直接通过bind方法将自定义字段注入到tooltip回调参数中,我们可以通过手动渲染离群点的方式实现需求:

  1. 先按照箱线图的离群点判定规则(值小于Q1-1.5IQR或大于Q3+1.5IQR),提前计算所有指标的离群点,关联对应自定义字段
  2. 关闭e_boxplot的内置离群点输出,用e_scatter绑定自定义字段渲染离群点,样式可以和原生离群点保持一致
  3. tooltip回调中区分悬浮的是箱线主体还是离群点,分别输出对应信息

完整可运行代码如下:

library(echarts4r)
library(dplyr)
library(tidyr)

# 原始数据集
df <- data.frame(
  my_name = letters[1:11],
  x = c(1:10, 25),
  y = c(1:10, -6)
)

# 离群点判定函数
is_outlier <- function(x) {
  q <- quantile(x, c(0.25, 0.75), na.rm = TRUE)
  iqr <- diff(q)
  return(x < q[1] - 1.5 * iqr | x > q[2] + 1.5 * iqr)
}

# 整理各指标的离群点数据,关联自定义名称
outlier_df <- df %>%
  pivot_longer(cols = c(x, y), names_to = "indicator", values_to = "value") %>%
  group_by(indicator) %>%
  filter(is_outlier(value)) %>%
  ungroup()

# 绘制图表
df |>
  e_charts() |>
  # 箱线图关闭内置离群点渲染
  e_boxplot(y, outliers = FALSE, name = "y指标") |>
  e_boxplot(x, outliers = FALSE, name = "x指标") |>
  # 手动添加离群点,绑定自定义名称
  e_scatter(
    data = outlier_df,
    x = indicator,
    y = value,
    bind = my_name,
    symbol_size = 6,
    color = "#2c3e50",
    legend_show = FALSE,
    legend_hover_link = FALSE
  ) |>
  e_tooltip(
    formatter = htmlwidgets::JS("
      function(params) {
        // 离群点(散点系列)的提示内容
        if(!params.value.length) {
          return `<strong>离群点</strong>
            <br/>所属指标:${params.name}
            <br/>数值:${params.value}
            <br/>自定义名称:${params.name}`
        }
        // 箱线主体的提示内容
        return `<strong>${params.seriesName}</strong>
          <br/>最大值:${params.value[5]}
          <br/>上四分位:${params.value[4]}
          <br/>中位数:${params.value[3]}
          <br/>下四分位:${params.value[2]}
          <br/>最小值:${params.value[1]}`
      }
    ")
  )

可根据需求自行调整离群点样式、tooltip输出字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:09:03