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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:10:11