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

使用Plotly绘制带分组均值聚合的热力图出错,请求协助

热力图聚合均值错误的排查与解决

出错原因

  1. Plotly 不识别 dplyr::group_by() 的分组逻辑,代码里的 group_by(cyl, gear) 完全无效,可直接移除。
  2. 热力图要求 z 参数是二维矩阵/宽格式数据,你直接传入原始 mpg 列再通过 transforms 聚合,无法自动将一维聚合结果转换为热力图所需的二维结构,导致结果异常。
  3. transforms 中 groups 参数写法错误,不需要用 c(cyl, gear),但即便修正写法,也无法解决 z 维度不匹配的核心问题。

推荐解法:先计算均值再绘图

最稳妥的方式是先用 dplyr 完成分组均值计算,将数据重塑为热力图需要的宽格式后,再传入 Plotly 绘制:

library(plotly)
library(dplyr)
library(tidyr)

# 1. 预处理数据:分组计算均值并转为宽格式
df_agg <- mtcars %>%
  mutate(gear = as.factor(gear), cyl = as.factor(cyl)) %>%
  group_by(cyl, gear) %>%
  summarise(avg_mpg = mean(mpg), .groups = "drop") %>%
  pivot_wider(names_from = cyl, values_from = avg_mpg)

# 2. 提取绘图所需的x、y、z参数
x_vals <- colnames(df_agg)[-1]
y_vals <- df_agg$gear
z_matrix <- as.matrix(df_agg[, -1])

# 3. 绘制热力图
plot_ly(
  x = x_vals,
  y = y_vals,
  z = z_matrix,
  type = "heatmap",
  hoverinfo = "text",
  text = apply(z_matrix, c(1,2), function(x) paste0("平均mpg: ", round(x, 2)))
) %>%
  layout(
    xaxis = list(title = "cyl"),
    yaxis = list(title = "gear")
  )

Plotly原生聚合的尝试(不推荐)

如果一定要用 Plotly 自带的 transforms 功能,可以调整参数,但这种方式对热力图兼容性较差,容易出现显示异常:

library(plotly)
library(dplyr)

df <- mtcars %>% 
  mutate(gear = as.factor(gear), cyl = as.factor(cyl)) %>% 
  select(cyl, gear, mpg)

plot_ly(df) %>%
  add_trace(
    x = ~cyl,
    y = ~gear,
    z = ~mpg,
    type = "heatmap"
  ) %>%
  layout(
    xaxis = list(type = "category"),
    yaxis = list(type = "category")
  ) %>%
  transform(
    type = "aggregate",
    groups = ~interaction(cyl, gear),
    aggregations = list(
      list(target = "z", func = "avg", enabled = TRUE)
    )
  )

注意:这种方法仍可能出现显示问题,因为热力图底层依赖二维 z 矩阵,原生聚合生成的一维数据无法很好适配,因此优先推荐第一种先聚合再绘图的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:55:09