dendrogram data not found (using key=dendrogram_leiden). Running `sc.tl.dendrogram` with default parameters. For fine tuning it is recommended to run `sc.tl.dendrogram` independently.
时间: 2025-07-21 10:05:13 浏览: 15
<think>我们正在处理一个关于单细胞分析中使用`sc.tl.dendrogram`时遇到“dendrogram data not found”错误的问题。这个错误通常发生在尝试绘制树状图时,但所需的树状图数据尚未被计算或存储。
根据Scanpy的文档和常见问题,`sc.tl.dendrogram`函数用于计算层次聚类树状图,并将结果存储在`uns`字典中。如果这个函数没有被正确执行或结果没有被保存,那么在尝试使用依赖于树状图的函数(如`sc.pl.dendrogram`或某些热图函数)时就会报错。
解决步骤:
1. 确保已经执行了层次聚类(例如使用`sc.tl.dendrogram`)并且没有报错。
2. 检查是否指定了正确的键(key)来访问树状图数据。默认情况下,树状图数据存储在`adata.uns['dendrogram']`中,但如果你指定了`groupby`参数,那么它可能会存储在`adata.uns['dendrogram_groupby']`中(其中`groupby`是你使用的分组名称,例如`'louvain'`)。
3. 如果还没有计算树状图,那么需要先运行`sc.tl.dendrogram`。
例如,如果你已经使用Leiden算法进行了聚类,并且聚类结果存储在`adata.obs['leiden']`中,那么你应该这样运行:
```python
sc.tl.dendrogram(adata, groupby='leiden')
```
4. 如果已经运行过,但仍然找不到,可能是因为在运行`sc.tl.dendrogram`时出现了错误(但被忽略或没有显示),或者数据没有被正确保存。可以尝试重新运行。
5. 另外,注意`sc.tl.dendrogram`需要先计算一个关联矩阵(correlation matrix),如果数据量很大,可能需要一些时间。
6. 如果重新运行后仍然不行,检查是否在运行`sc.tl.dendrogram`之前已经计算了PCA。因为树状图通常基于主成分(或使用其他降维结果)进行计算。如果没有降维数据,可能需要先运行`sc.tl.pca`。
7. 如果上述步骤都无效,可以尝试清除`uns`中的旧数据,再重新计算。
示例代码:
假设我们有一个AnnData对象`adata`,已经进行了预处理(包括归一化、对数转换、PCA等),并运行了Leiden聚类:
```python
# 如果还没有进行PCA,需要先做PCA
sc.tl.pca(adata)
# 运行Leiden聚类(如果还没有做)
sc.tl.leiden(adata, key_added='leiden')
# 计算树状图
sc.tl.dendrogram(adata, groupby='leiden')
```
然后,你可以使用`sc.pl.dendrogram`来绘制树状图。
8. 如果还是遇到问题,可能是Scanpy版本问题,尝试升级Scanpy到最新版本。
注意:在运行`sc.tl.dendrogram`时,确保`groupby`参数的值是存在于`adata.obs`中的列名。
如果问题仍然存在,请检查错误信息的具体内容,可能还需要检查输入数据是否有效。
根据以上步骤,我们可以解决大多数“dendrogram data not found”的问题。
现在,生成相关问题:</think>### 解决 `sc.tl.dendrogram` 运行时提示 "dendrogram data not found" 的问题
该错误通常发生在 Scanpy 的层次聚类树状图计算流程中,主要原因是 **聚类分组信息缺失** 或 **树状图计算未正确执行**。以下是具体解决步骤:
---
#### 1. **确认聚类分组存在**
- **问题本质**:`dendrogram` 需要基于已计算的聚类结果(如 Leiden)分组
- **解决方法**:
```python
# 检查是否存在聚类分组(例如 'leiden')
print(adata.obs.columns) # 确认有 'leiden' 列
# 若不存在,先运行 Leiden 聚类
sc.tl.leiden(adata, key_added='leiden') # 结果存入 adata.obs['leiden']
```
---
#### 2. **正确计算树状图**
- **关键步骤**:显式调用 `dendrogram` 并指定聚类分组
```python
# 计算树状图(必须指定 groupby 参数)
sc.tl.dendrogram(adata, groupby='leiden') # ⚠️ 确保与聚类列名一致
```
- **验证数据**:检查 `uns` 中是否生成树状图数据
```python
print(adata.uns['dendrogram_leiden']) # 应返回字典结构
```
---
#### 3. **处理版本兼容性问题**
- **Scanpy 版本差异**:部分旧版本需手动计算距离矩阵
```python
# 显式计算距离矩阵(旧版本兼容)
sc.tl.pca(adata)
sc.pp.neighbors(adata) # 生成连接矩阵
sc.tl.dendrogram(adata, groupby='leiden')
```
---
#### 4. **避免覆盖数据**
- **备份关键数据**:树状图信息存储在 `adata.uns` 中,后续操作可能覆盖它
```python
# 在修改 adata 前备份树状图
import copy
dendro_backup = copy.deepcopy(adata.uns['dendrogram_leiden'])
```
---
#### 5. **完整示例代码**
```python
import scanpy as sc
# 加载数据(示例)
adata = sc.datasets.pbmc68k_reduced()
# 1. 计算聚类
sc.tl.leiden(adata, key_added='leiden')
# 2. 计算树状图
sc.tl.dendrogram(adata, groupby='leiden') # ⚠️ 关键步骤
# 3. 绘制结果(此时应无报错)
sc.pl.dendrogram(adata, groupby='leiden')
```
---
### 关键注意事项
1. **参数一致性**:`groupby` 参数值必须与聚类结果列名 **完全匹配**(区分大小写)
2. **执行顺序**:必须在聚类(`leiden`)之后、可视化(`sc.pl.dendrogram`)之前调用
3. **数据验证**:通过 `print(adata.uns.keys())` 检查是否存在 `dendrogram_{groupby}` 键
> 此问题通常由流程顺序错误导致,正确执行 Leiden 聚类 → 树状图计算 → 可视化 三步即可解决[^1]。
---
阅读全文
相关推荐




















