Scanpy运行Leiden聚类时报PCA维度不足、找不到leiden键错误
问题现象
基于Scanpy开展单细胞分析流程时先后触发两类报错:
- 运行邻域计算、Leiden聚类代码段时,首先抛出主成分数量不足的错误:
ValueError:
X_pcadoes not have enough PCs. Rerunsc.pp.pcawith adjustedn_comps
对应执行的代码如下:
for adata in [adata_fish]: sc.pp.neighbors(adata, n_neighbors=10, n_pcs=50) sc.tl.leiden(adata)
- 由于上述代码执行中断,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。
修复步骤
- 重新执行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)
- 最后运行原可视化代码即可正常输出结果。
内容的提问来源于stack exchange,提问作者Caroline
相关产品推荐
相关产品推荐

