如何修改R语言factoextra包fviz_dist绘制的余弦相似度热力图对角线值为1
解决fviz_dist绘制余弦相似度热力图时对角线显示0的问题
嘿,这个问题我之前也碰到过!核心原因是fviz_dist是专门为距离矩阵设计的——距离矩阵的对角线本来就是0(自身到自身的距离为0),所以它会默认把输入矩阵的对角线强制设为0,哪怕你传入的是余弦相似度矩阵(对角线为1)。
下面给你两种简单的解决办法,按需选择:
方法一:修改fviz_dist生成的绘图数据
如果你习惯用fviz_dist的默认样式,可以先生成绘图对象,再手动修正对角线的值:
library(factoextra) library(ggplot2) # 假设你的余弦相似度矩阵名为cos_sim # 先生成初始绘图对象 p <- fviz_dist(as.dist(cos_sim)) # 提取绘图的底层数据 plot_data <- p$data # 定位对角线行(x和y标签相同的行) diag_indices <- plot_data$x == plot_data$y # 将对角线的value值替换为1 plot_data$value[diag_indices] <- 1 # 重新绘制热力图(保留fviz_dist的风格,只是修正了数值) updated_plot <- ggplot(plot_data, aes(x = x, y = y, fill = value)) + geom_tile() + geom_text(aes(label = round(value, 2))) + # 显示保留两位小数的数值 scale_fill_gradient(low = "white", high = "#0073C2FF") + # 颜色可自定义 theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 查看结果 print(updated_plot)
方法二:直接用ggplot2绘制(更灵活)
既然fviz_dist本质是封装了ggplot2,不如直接用ggplot2基于原始相似度矩阵绘图,这样完全不会有自动修改对角线的问题:
library(ggplot2) library(reshape2) # 将矩阵转换为ggplot需要的长格式数据 cos_sim_long <- melt(cos_sim) # 绘制热力图 ggplot(cos_sim_long, aes(x = Var1, y = Var2, fill = value)) + geom_tile(color = "white") + # 给每个格子加白色边框,更清晰 geom_text(aes(label = round(value, 2)), size = 3) + scale_fill_gradient(low = "#F7FBFF", high = "#003399") + # 自定义渐变颜色 theme_bw() + theme( axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1), axis.title = element_blank() )
这样画出来的热力图,对角线就会显示原始的1啦!两种方法都能解决问题,第一种适合想保留fviz_dist风格的情况,第二种则更灵活可控。
内容的提问来源于stack exchange,提问作者Lzz0
相关产品推荐
相关产品推荐

