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

使用MACCS Fingerprint绘制热力图异常:所有值均为1的问题排查

问题分析与解决方案

你的热力图全显示1的核心问题是**tri2mat函数中return arr的缩进错误**,导致函数在第一次循环时就返回,矩阵仅填充了极少量元素,其余保持初始值1。此外还有几个细节需要优化,以下是修正后的完整方案:

核心错误修正

原tri2mat函数中,return arr被放在了for i in range(m)的循环内部,导致函数执行到第一个i值时就直接返回,矩阵大部分元素还是初始化的1。将return语句移到循环外部即可解决。

同时,矩阵维度m的计算公式可以更清晰,对应三角矩阵长度公式n*(n-1)/2,正确的推导应为m = int((1 + np.sqrt(1 + 8*len(tri_arr)))/2)。

修正后的完整代码

import matplotlib
import os
from rdkit import Chem
from rdkit.Chem import AllChem
import numpy as np
from rdkit.Chem import MACCSkeys
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem import Draw
import seaborn as sns
import matplotlib.pyplot as plt
from rdkit.DataManip.Metric import GetTanimotoDistMat
from rdkit.DataManip.Metric import GetTanimotoSimMat

# 读取分子并过滤无效分子
suppl = Chem.SDMolSupplier('/Users/emmafath/Desktop/toxicitydata_toxic_20.3.sdf')
mols = [x for x in suppl if x is not None]  # 过滤None,避免后续报错

# 生成MACCS指纹
maccsfps = [MACCSkeys.GenMACCSKeys(x) for x in mols]

# 计算距离和相似度矩阵(三角扁平化格式)
distmat = GetTanimotoDistMat(maccsfps)
simmat_flat = GetTanimotoSimMat(maccsfps)  # 重命名避免覆盖

def tri2mat(tri_arr):
    n = len(tri_arr)
    # 计算矩阵维度:满足m*(m-1)/2 = n
    m = int((1 + np.sqrt(1 + 8 * n)) / 2)
    arr = np.ones([m, m])
    idx = 0
    for i in range(m):
        for j in range(i):
            arr[i][j] = tri_arr[idx]
            arr[j][i] = tri_arr[idx]
            idx += 1
    return arr  # 移到循环外部

# 转换为完整矩阵
distarr = tri2mat(distmat)
simarr = tri2mat(simmat_flat)

# 绘制相异度热力图
plt.figure(figsize=(10,8))
heatmapdis = sns.heatmap(distarr, cmap="YlGnBu")
heatmapdis.set_title('Dissimilarity using MACCS fingerprints', fontdict={'fontsize':12}, pad=12)
plt.show()

# 绘制相似度热力图
plt.figure(figsize=(10,8))
heatmapsim = sns.heatmap(simarr, cmap="YlOrRd")
heatmapsim.set_title('Similarity using MACCS fingerprints', fontdict={'fontsize':12}, pad=12)
plt.show()

其他优化点说明

  1. 过滤无效分子:添加if x is not None过滤SD文件中无法解析的分子,避免后续生成指纹时出错。
  2. 变量名冲突:将simmat重命名为simmat_flat,避免被转换后的矩阵覆盖原数据。
  3. 索引计数优化:改用idx变量来遍历扁平化的三角矩阵,比原公式i + j -1更可靠,避免索引计算错误。
  4. 绘图优化:添加plt.figure()设置画布大小,避免热力图显示拥挤;指定不同配色方案区分相似度/相异度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:27:55