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

使用scanpy绘制PC方差比时遇Axis limits cannot be NaN or Inf错误

问题解决:scanpy绘制PCA方差比log图报错

错误原因

报错核心是部分PC的方差比为0:当设置log=True时,np.log(0)会生成-inf,导致matplotlib无法设置有效坐标轴范围,最终抛出ValueError: Axis limits cannot be NaN or Inf。你导出CSV检查的是原始数据,但问题出在PCA计算后的方差比结果中,和原始数据无关。

验证方法

先查看PCA计算得到的方差比,确认是否存在0值:

print(adata.uns['pca']['variance_ratio'][:50])

输出中若包含0,即可对应报错原因。

解决方案

方案1:过滤掉方差比为0的PC

只绘制方差比大于0的PC,调整n_pcs参数为非零方差比的数量:

# 获取非零方差比的PC数量
valid_pcs = sum(adata.uns['pca']['variance_ratio'] > 0)
# 绘制有效PC的方差比(log=True)
sc.pl.pca_variance_ratio(adata, log=True, n_pcs=valid_pcs)

方案2:手动用log1p绘图(更安全)

np.log1p()对0的处理为log1p(0)=0,不会产生inf,适合替代log。手动提取方差比后绘图:

import matplotlib.pyplot as plt
import numpy as np

variance_ratios = adata.uns['pca']['variance_ratio'][:50]
# 可选:将0替换为极小值,避免后续可能的异常
variance_ratios[variance_ratios == 0] = 1e-10

plt.plot(np.arange(1, len(variance_ratios)+1), np.log1p(variance_ratios))
plt.xlabel('PC')
plt.ylabel('Log1p(variance ratio)')
plt.title('PCA Variance Ratio (log1p)')
plt.show()

方案3:临时修改方差比的0值

若必须使用scanpy原生函数,可临时把方差比中的0替换为极小正数:

# 备份原始方差比
original_vr = adata.uns['pca']['variance_ratio'].copy()
# 替换0为极小值
adata.uns['pca']['variance_ratio'][adata.uns['pca']['variance_ratio'] == 0] = 1e-10
# 绘图
sc.pl.pca_variance_ratio(adata, log=True, n_pcs=50)
# 恢复原始方差比(避免影响后续分析)
adata.uns['pca']['variance_ratio'] = original_vr

额外提示

如果非零方差比的PC数量很少,说明数据可能存在冗余或维度压缩已充分,此时可考虑减少后续分析使用的PC数量,无需强行绘制50个PC的方差比。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:00:27