You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Seaborn热力图中用不同颜色标记统计上不显著的数值

保留相关性数值并高亮不显著项的Seaborn热力图实现

我来帮你解决这个问题!你之前的方法会把不显著的相关性设为NaN导致空白,现在我们可以通过保留完整相关系数矩阵,同时给不显著的单元格添加特殊背景色的方式实现需求,既保留所有信息,又能清晰区分统计显著性。

完整实现代码

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import pearsonr

# 加载示例数据集
planets = sns.load_dataset('planets')

# 计算皮尔逊相关系数矩阵
corr_matrix = planets.corr()

# 计算每个相关性对应的p值矩阵,对角线设为1(自身相关性无显著性意义)
p_value_matrix = planets.corr(method=lambda x, y: pearsonr(x, y)[1])
np.fill_diagonal(p_value_matrix.values, 1)

# 设置显著性阈值
significance_threshold = 0.05

# 创建画布
plt.figure(figsize=(6, 6))

# 绘制完整热力图,显示所有相关系数
ax = sns.heatmap(
    corr_matrix,
    annot=True,          # 显示数值
    square=True,         # 单元格为正方形
    cmap='coolwarm',     # 热力图配色
    annot_kws={"size": 10},  # 标注字体大小
    fmt='.2f'            # 数值保留两位小数
)

# 标记不显著的项(p值 >= 阈值)
non_significant_mask = p_value_matrix >= significance_threshold

# 遍历所有单元格,给不显著项添加浅灰色半透明背景
for row in range(corr_matrix.shape[0]):
    for col in range(corr_matrix.shape[1]):
        if non_significant_mask.iloc[row, col]:
            # 获取当前单元格的图形对象
            cell_patch = ax.patches[row * corr_matrix.shape[1] + col]
            # 设置背景色为浅灰色,半透明
            cell_patch.set_facecolor('#e0e0e0')
            cell_patch.set_alpha(0.7)

# 添加标题
plt.title('Correlation Matrix (Non-significant entries in gray)')
plt.show()

关键步骤说明

  1. 完整计算相关系数与p值:不再过滤不显著的项,保留完整的相关系数矩阵,同时计算对应的p值矩阵(对角线设为1,因为变量与自身的相关性无统计显著性意义)。
  2. 绘制基础热力图:先画出包含所有数值的热力图,确保所有相关性信息都被显示。
  3. 高亮不显著项:通过遍历每个单元格,给p值超过阈值的单元格设置浅灰色半透明背景,既保留数值,又能直观区分显著与不显著的相关性。

这种方法完美解决了空白区域的问题,同时清晰地标记出统计上不显著的相关性,让热力图的信息更完整直观。

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

火山引擎 最新活动