使用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
相关产品推荐
相关产品推荐

