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矩阵中存在大量非有限值,进而触发聚类时的距离矩阵错误。
修复步骤
- 修正填充值
将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)
- 验证矩阵数据有效性
绘图前添加检查,确保矩阵无NaN或无限值:
import numpy as np # 检查是否存在NaN print("是否有NaN值:", df_Ctrl.isna().any().any()) # 检查是否存在无限值 print("是否有无限值:", df_Ctrl.isin([np.inf, -np.inf]).any().any())
- 兜底处理异常值
如果检查发现仍有异常值,手动替换:
df_Ctrl = df_Ctrl.replace([np.inf, -np.inf], 1e-6).fillna(1e-6)
内容的提问来源于stack exchange,提问作者plnnvkv
相关产品推荐
相关产品推荐

