如何将scanpy sc.pl.umap生成的多个ax对象合并为含子图的单张图像
scanpy多UMAP结果合并为单张图像的实现方法
核心逻辑是直接给sc.pl.umap传入预先创建的子图坐标系对象,无需单独生成ax后再二次拼接,具体操作步骤如下:
1. 依赖导入
先导入需要的库:
import scanpy as sc import matplotlib.pyplot as plt
2. 基础实现(2个UMAP并排示例)
# 第一步:创建画布和子图对象,1行2列,可自行调整行数、列数、画布尺寸 fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(12, 5)) # 第二步:分别给两个数据集绘制UMAP,传入对应子图的ax参数,show必须设为False # 绘制第一个数据集的UMAP,指定到第一个子图axes[0] sc.pl.umap( adata1, color="cell_type", # 可换成你要展示的分组、基因表达等字段 ax=axes[0], show=False, title="数据集1" ) # 绘制第二个数据集的UMAP,指定到第二个子图axes[1] sc.pl.umap( adata2, color="cell_type", ax=axes[1], show=False, title="数据集2", # 如需统一图例可加下面参数隐藏第二个图的图例 # legend_loc=None ) # 第三步:调整子图间距,避免标签、图例重叠 plt.tight_layout() # 可选操作:直接保存为图片 plt.savefig("combined_umap.png", dpi=300, bbox_inches="tight") # 你需要的统一图像对象就是前面创建的fig,可直接用于后续编辑
3. 扩展说明
- 如果需要生成多行多列的UMAP组合图,调整
plt.subplots的nrows、ncols参数即可,二维子图的索引格式为axes[行索引, 列索引],比如2行2列的第一个子图对应axes[0,0] - 如需统一全局图例,只需保留第一个图的图例,其余子图绘制时添加
legend_loc=None参数隐藏自有图例,再根据需求调用fig.legend()手动添加全局图例即可 - 如果已经单独生成了单个UMAP的ax对象,也可以通过
fig.add_axes(ax)的方式将其添加到统一画布中,适配性更强但需要自行调整坐标避免重叠
内容的提问来源于stack exchange,提问作者hgmhgm
相关产品推荐
相关产品推荐

