You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言Plotly箱线图悬停无汇总统计信息问题咨询

解决Plotly箱线图的两个问题:boxmode错误与悬停统计信息显示

先来说你遇到的'layout' objects don't have these attributes: 'boxmode'错误——这个其实是代码语法/版本适配的问题,并非和悬停无关哦。在Plotly R中,boxmode参数的正确设置方式会受版本影响,后面我会给你修正后的写法。

然后是核心问题:悬停时只显示单个数据点的cutprice,看不到箱线的汇总统计量(Min、Q1、中位数、均值、Q3、Max)。这是Plotly箱线图的默认行为,不是你的操作问题,默认的hover逻辑只聚焦单个数据点,要显示箱线的统计信息,我们需要手动计算这些值并自定义hover内容。

方法一:用ggplot2 + ggplotly(推荐,语法更易上手)

先通过ggplot2绘制箱线图,再转换成Plotly对象,同时自定义tooltip内容,这样能轻松展示所有统计量:

library(ggplot2)
library(plotly)
library(dplyr)

# 先计算每个cut+clarity组合的统计量
diamonds_stats <- diamonds %>%
  group_by(cut, clarity) %>%
  summarise(
    min_price = min(price),
    q1_price = quantile(price, 0.25),
    median_price = median(price),
    mean_price = round(mean(price), 2),
    q3_price = quantile(price, 0.75),
    max_price = max(price),
    .groups = "drop"
  )

# 用ggplot2画基础箱线图
p <- ggplot(diamonds, aes(x = cut, y = price, color = clarity)) +
  geom_boxplot() +
  theme_minimal()

# 转换成Plotly并自定义hover内容
ggplotly(p, tooltip = c("x", "color", "y")) %>%
  layout(boxmode = "group") %>% # 这里boxmode可正常生效
  add_trace(
    data = diamonds_stats,
    x = ~cut, y = ~median_price,
    type = "scatter",
    mode = "markers",
    marker = list(opacity = 0), # 隐藏用于承载hover的标记点
    hoverinfo = "text",
    text = ~paste0(
      "Cut: ", cut, "<br>",
      "Clarity: ", clarity, "<br>",
      "Min: ", min_price, "<br>",
      "Q1: ", q1_price, "<br>",
      "Median: ", median_price, "<br>",
      "Mean: ", mean_price, "<br>",
      "Q3: ", q3_price, "<br>",
      "Max: ", max_price
    ),
    showlegend = FALSE
  )

方法二:直接用plot_ly自定义悬停文本

如果你更倾向于直接用plot_ly构建图表,同样需要先统计数据,再在箱线图中添加自定义hover信息:

library(plotly)
library(dplyr)

# 提前计算统计量
diamonds_stats <- diamonds %>%
  group_by(cut, clarity) %>%
  summarise(
    min_price = min(price),
    q1_price = quantile(price, 0.25),
    median_price = median(price),
    mean_price = round(mean(price), 2),
    q3_price = quantile(price, 0.75),
    max_price = max(price),
    .groups = "drop"
  )

# 直接构建Plotly箱线图
plot_ly() %>%
  add_boxplot(
    data = diamonds,
    x = ~cut, y = ~price, color = ~clarity,
    hoverinfo = "text",
    text = ~paste0("Cut: ", cut, "<br>", "Clarity: ", clarity, "<br>", "Price: ", price)
  ) %>%
  add_trace(
    data = diamonds_stats,
    x = ~cut, y = ~median_price,
    type = "scatter",
    mode = "markers",
    marker = list(opacity = 0),
    hoverinfo = "text",
    text = ~paste0(
      "Cut: ", cut, "<br>",
      "Clarity: ", clarity, "<br>",
      "Min: ", min_price, "<br>",
      "Q1: ", q1_price, "<br>",
      "Median: ", median_price, "<br>",
      "Mean: ", mean_price, "<br>",
      "Q3: ", q3_price, "<br>",
      "Max: ", max_price
    ),
    showlegend = FALSE
  ) %>%
  layout(boxmode = "group")

关于boxmode错误的补充说明

你之前的代码报错,大概率是因为使用了较旧版本的Plotly R包。旧版本中boxmode需要嵌套在xaxis参数里,写法是layout(xaxis = list(boxmode = "group"));新版本已经支持直接在layout顶层设置boxmode。如果还是报错,建议更新Plotly包:install.packages("plotly")

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

火山引擎 最新活动