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

PyComplexHeatmap报错:压缩距离矩阵需仅含有限值的排查求助

问题

使用Python的PyComplexHeatmap包绘制热图时,触发如下错误:

Starting plotting..
Starting calculating row orders..
Reordering rows...
ValueError: The condensed distance matrix must contain only finite values.

用户代码如下:

import pandas as pd 
import PyComplexHeatmap

data = {
    'Geneid': ['K20859', 'K16698', 'K20859', 'K03781', 'K07452', 'K19147', 'K16698', 'K16698', 'K03781', 'K16698'],
    'Diagnosis': ['iRBD', 'iRBD', 'PD', 'PD', 'PD', 'PD', 'Ctrl', 'PD', 'PD', 'PD'],
    'G': ['DTU008', 'Methanosphaera', 'Methanomassiliicoccus_A', 'Methanomethylophilus', 'Methanomethylophilus', 'Methanomethylophilus', 'Methanosphaera', 'Methanobrevibacter_A', 'Methanomassiliicoccus_A', 'Methanosphaera'],
    'tpm': [0.384566, 0.614127, 1.264605, 1.361017, 1.536711, 1.727445, 2.444317, 2.745661, 3.101456, 3.288112]
}

df_G_level = pd.DataFrame(data)

pivot_tables = {}
diagnosis_values = df_G_level['Diagnosis'].unique()

for diagnosis in diagnosis_values:
    filtered_df = df_G_level[df_G_level['Diagnosis'] == diagnosis]
    pivot_table = filtered_df.pivot_table(index='Geneid', columns='G', values='tpm', aggfunc='sum', fill_value=1e-6)
    pivot_table = pivot_table.reindex(index=df_G_level['Geneid'].unique(), columns=df_G_level['G'].unique(), fill_value=a)
    pivot_tables[diagnosis] = pivot_table

df_Ctrl = pivot_tables['Ctrl']

row_ha = HeatmapAnnotation(selected=anno_label(df_Ctrl.index.to_frame(), colors='black'), axis=0, verbose=0, orientation='right')

cm1 = ClusterMapPlotter(data=df_Ctrl, left_annotation=None, show_rownames=True, show_colnames=True, row_dendrogram=False, col_dendrogram=False, cmap='Purples', rasterized=True, row_split_gap=0.1, center=0.5, plot=True, label='tpm')

用户已尝试用1e-6替换透视表缺失值,但仍报错,需定位问题并解决。

问题定位与解决方案

核心问题:未定义变量导致矩阵含NaN

代码中fill_value=a的a是未定义变量,执行时会被解析为NaN,导致生成的df_Ctrl矩阵中存在大量非有限值,进而触发聚类时的距离矩阵错误。

修复步骤

  1. 修正填充值
    将fill_value=a改为明确的数值,保持和之前一致的1e-6:
pivot_table = pivot_table.reindex(index=df_G_level['Geneid'].unique(), columns=df_G_level['G'].unique(), fill_value=1e-6)
  1. 验证矩阵数据有效性
    绘图前添加检查,确保矩阵无NaN或无限值:
import numpy as np

# 检查是否存在NaN
print("是否有NaN值:", df_Ctrl.isna().any().any())
# 检查是否存在无限值
print("是否有无限值:", df_Ctrl.isin([np.inf, -np.inf]).any().any())
  1. 兜底处理异常值
    如果检查发现仍有异常值,手动替换:
df_Ctrl = df_Ctrl.replace([np.inf, -np.inf], 1e-6).fillna(1e-6)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:32:27