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

如何在Plotly R箱线图中添加悬停信息作为静态标注?

在Plotly箱线图中添加永久显示的统计标注(适配PDF导出)

可以通过plotly_build()函数提取Plotly自动计算的箱线图统计数据,再用标注功能将这些数据永久显示在图表上,无需鼠标悬停,完美适配PDF导出需求。

单箱线图实现步骤

  1. 生成基础箱线图并构建包含统计数据的对象
library(plotly)
set.seed(1) 

# 创建基础箱线图
p <- plot_ly(y = ~rnorm(500), type = "box", hoverinfo = 'y') %>%
  layout(yaxis = list(hoverformat = '.2f'))

# 构建plotly对象,提取内部计算的统计数据
p_build <- plotly_build(p)
  1. 提取箱线图关键统计值
    Plotly会自动计算最小值、四分位数、中位数、最大值、均值等数据,存储在构建后的对象中:
stats <- list(
  min = p_build$x$data[[1]]$lowerfence,
  q1 = p_build$x$data[[1]]$q1,
  median = p_build$x$data[[1]]$median,
  q3 = p_build$x$data[[1]]$q3,
  max = p_build$x$data[[1]]$upperfence,
  mean = p_build$x$data[[1]]$mean
)
  1. 添加永久标注到图表
    将提取的统计值以标注形式添加到箱线图旁,位置可按需调整:
p_annotated <- p %>%
  # 最小值标注
  add_annotations(
    x = 1.1,  # 标注位置在箱线图右侧,可微调
    y = stats$min,
    text = paste0("Min: ", round(stats$min, 2)),
    showarrow = FALSE,
    xanchor = "left"
  ) %>%
  # Q1标注
  add_annotations(
    x = 1.1,
    y = stats$q1,
    text = paste0("Q1: ", round(stats$q1, 2)),
    showarrow = FALSE,
    xanchor = "left"
  ) %>%
  # 中位数标注
  add_annotations(
    x = 1.1,
    y = stats$median,
    text = paste0("Median: ", round(stats$median, 2)),
    showarrow = FALSE,
    xanchor = "left"
  ) %>%
  # Q3标注
  add_annotations(
    x = 1.1,
    y = stats$q3,
    text = paste0("Q3: ", round(stats$q3, 2)),
    showarrow = FALSE,
    xanchor = "left"
  ) %>%
  # 最大值标注
  add_annotations(
    x = 1.1,
    y = stats$max,
    text = paste0("Max: ", round(stats$max, 2)),
    showarrow = FALSE,
    xanchor = "left"
  ) %>%
  # 均值标注(用红色字体区分)
  add_annotations(
    x = 1.1,
    y = stats$mean,
    text = paste0("Mean: ", round(stats$mean, 2)),
    showarrow = FALSE,
    xanchor = "left",
    font = list(color = "red")
  )

# 预览带标注的图表
p_annotated
  1. 导出为PDF
    使用orca或webshot工具导出PDF,标注会永久保留:
# 方法1:使用orca(需提前安装orca工具)
plotly::orca(p_annotated, "boxplot_with_annotations.pdf")

# 方法2:使用webshot(需安装webshot包)
# install.packages("webshot")
# webshot::webshot(plotly::plotly_IMAGE(p_annotated, format = "pdf"), "boxplot_with_annotations.pdf")

多箱线图批量处理

如果是分组的多箱线图,可通过循环自动为每个箱线图添加标注:

set.seed(1)
# 生成分组数据
df <- data.frame(
  group = rep(c("A", "B", "C"), each = 200),
  value = c(rnorm(200), rnorm(200, 2), rnorm(200, -1))
)

# 创建多箱线图
p_multi <- plot_ly(df, x = ~group, y = ~value, type = "box", hoverinfo = 'y') %>%
  layout(yaxis = list(hoverformat = '.2f'))

# 构建对象提取统计数据
p_multi_build <- plotly_build(p_multi)

# 循环为每个分组箱线图添加标注
for(i in 1:length(p_multi_build$x$data)){
  stats <- list(
    min = p_multi_build$x$data[[i]]$lowerfence,
    q1 = p_multi_build$x$data[[i]]$q1,
    median = p_multi_build$x$data[[i]]$median,
    q3 = p_multi_build$x$data[[i]]$q3,
    max = p_multi_build$x$data[[i]]$upperfence,
    mean = p_multi_build$x$data[[i]]$mean
  )
  
  p_multi <- p_multi %>%
    add_annotations(
      x = i + 0.1,
      y = stats$min,
      text = paste0("Min: ", round(stats$min, 2)),
      showarrow = FALSE,
      xanchor = "left"
    ) %>%
    add_annotations(
      x = i + 0.1,
      y = stats$q1,
      text = paste0("Q1: ", round(stats$q1, 2)),
      showarrow = FALSE,
      xanchor = "left"
    ) %>%
    add_annotations(
      x = i + 0.1,
      y = stats$median,
      text = paste0("Median: ", round(stats$median, 2)),
      showarrow = FALSE,
      xanchor = "left"
    ) %>%
    add_annotations(
      x = i + 0.1,
      y = stats$q3,
      text = paste0("Q3: ", round(stats$q3, 2)),
      showarrow = FALSE,
      xanchor = "left"
    ) %>%
    add_annotations(
      x = i + 0.1,
      y = stats$max,
      text = paste0("Max: ", round(stats$max, 2)),
      showarrow = FALSE,
      xanchor = "left"
    ) %>%
    add_annotations(
      x = i + 0.1,
      y = stats$mean,
      text = paste0("Mean: ", round(stats$mean, 2)),
      showarrow = FALSE,
      xanchor = "left",
      font = list(color = "red")
    )
}

# 预览多箱线图
p_multi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:35:28