如何在Plotly R箱线图中添加悬停信息作为静态标注?
在Plotly箱线图中添加永久显示的统计标注(适配PDF导出)
可以通过plotly_build()函数提取Plotly自动计算的箱线图统计数据,再用标注功能将这些数据永久显示在图表上,无需鼠标悬停,完美适配PDF导出需求。
单箱线图实现步骤
- 生成基础箱线图并构建包含统计数据的对象
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)
- 提取箱线图关键统计值
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 )
- 添加永久标注到图表
将提取的统计值以标注形式添加到箱线图旁,位置可按需调整:
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
- 导出为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
相关产品推荐
相关产品推荐

