如何在R语言Plotly热力图中添加单元格数值?
Plotly热力图显示所有单元格数值的解决方法
问题描述
想要在Plotly绘制的热力图中显示每个单元格的数值,但尝试add_annotation或调整layout参数时,数值仅显示在矩阵对角线上,原代码如下:
library(RColorBrewer) library(plotly) data <- matrix(data=20, nrow = 10, ncol = 10) data<- as.data.frame(data) colnames(data) <- letters[1:10] rownames(data) <- LETTERS[1:10] pal <- colorRampPalette(brewer.pal(9, "YlOrRd"))(29) pal[1] <-c("#FFFFFF") plot_ly(x = colnames(data), y = rownames(data), z = data, type = "heatmap", colors = pal, height=700, width=700, xgap=10, ygap=10, showscale=TRUE)
解决方案
问题出在未批量生成所有单元格的标注信息。需要先构造所有单元格的坐标和对应数值文本,再一次性添加到图中。修改后的代码如下:
library(RColorBrewer) library(plotly) data <- matrix(data=20, nrow = 10, ncol = 10) data <- as.data.frame(data) colnames(data) <- letters[1:10] rownames(data) <- LETTERS[1:10] pal <- colorRampPalette(brewer.pal(9, "YlOrRd"))(29) pal[1] <- "#FFFFFF" # 构造所有标注的x、y坐标和数值文本 x_vals <- rep(colnames(data), each = nrow(data)) y_vals <- rep(rownames(data), ncol(data)) text_vals <- as.character(as.matrix(data)) # 绘制热力图并批量添加标注 plot_ly(x = colnames(data), y = rownames(data), z = data, type = "heatmap", colors = pal, height=700, width=700, xgap=10, ygap=10, showscale=TRUE) %>% add_annotations( x = x_vals, y = y_vals, text = text_vals, showarrow = FALSE, font = list(color = ifelse(data >= 10, "black", "white")) # 可选:根据背景色调整文字颜色 )
关键说明
x_vals和y_vals通过重复列名、行名,生成每个单元格对应的坐标text_vals将矩阵转为字符向量,对应每个单元格的数值add_annotations一次性添加所有标注,设置showarrow=FALSE去掉箭头干扰- 可选添加文字颜色逻辑,根据单元格数值深浅调整文字颜色,提升可读性
内容的提问来源于stack exchange,提问作者Manuel Tiburtini
相关产品推荐
相关产品推荐

