使用Plotly绘制带分组均值聚合的热力图出错,请求协助
热力图聚合均值错误的排查与解决
出错原因
- Plotly 不识别
dplyr::group_by()的分组逻辑,代码里的group_by(cyl, gear)完全无效,可直接移除。 - 热力图要求
z参数是二维矩阵/宽格式数据,你直接传入原始mpg列再通过transforms聚合,无法自动将一维聚合结果转换为热力图所需的二维结构,导致结果异常。 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
相关产品推荐
相关产品推荐

