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

Scanpy运行Leiden聚类时报PCA维度不足、找不到leiden键错误

问题现象

基于Scanpy开展单细胞分析流程时先后触发两类报错:

  1. 运行邻域计算、Leiden聚类代码段时,首先抛出主成分数量不足的错误:

ValueError: X_pca does not have enough PCs. Rerun sc.pp.pca with adjusted n_comps
对应执行的代码如下:

for adata in [adata_fish]:
    sc.pp.neighbors(adata, n_neighbors=10, n_pcs=50)
    sc.tl.leiden(adata)
  1. 由于上述代码执行中断,Leiden聚类结果未正常生成,后续运行tSNE可视化代码时触发键不存在的错误:

KeyError: 'Could not find key leiden in .var_names or .obs.columns.'
对应执行的可视化代码如下:

# Plot Leiden clusters on tSNE 
for adata in [adata_fish]:
    print(adata.uns["name"], ":")
    sc.pl.tsne(adata, color=["leiden"], cmap="tab20")
    sc.pl.tsne(adata, color=markers, layer="sqrt_norm")
根因分析
  • 调用sc.pp.neighbors时传入参数n_pcs=50,要求用前50个主成分计算细胞邻域,但此前执行sc.pp.pca时设置的n_comps(生成的主成分总数)小于50,导致邻域计算步骤直接中断。
  • 邻域计算是Leiden聚类的前置依赖,邻域步骤失败后sc.tl.leiden未实际执行,adata.obs中不会写入leiden聚类列,后续可视化代码查询该字段时自然触发KeyError。
修复步骤
  1. 重新执行PCA降维,显式设置n_comps参数,保证生成的主成分数大于后续邻域计算需要的50个,建议预留冗余:
# 注意:执行前确认归一化、高变基因筛选等预处理步骤已完成
sc.pp.pca(adata_fish, n_comps=100)

校验方式:执行print(adata_fish.obsm['X_pca'].shape),输出的第二个维度值≥50即符合要求。
2. 重新运行邻域计算与Leiden聚类代码:

for adata in [adata_fish]:
    sc.pp.neighbors(adata, n_neighbors=10, n_pcs=50)
    sc.tl.leiden(adata)

校验方式:执行print('leiden' in adata_fish.obs.columns),返回True即说明聚类结果已正常写入。
3. 补充tSNE计算步骤(如果此前未执行过),避免后续可视化报tSNE坐标不存在的错误:

sc.tl.tsne(adata_fish, n_pcs=50)
  1. 最后运行原可视化代码即可正常输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:21:50