Scanpy可视化技巧--UMAP图优化

前几天后台有同学私信说想要美化下scanpy绘制的UMAP图,给了篇单细胞文章中的UMAP截图,我们写了一个函数,用于美化scanpy的UMAP图,思路还是比较简单,基本上全部是由deeepseek帮忙实现,能让你的UMAP图拥有:

✓ 细胞亚群轮廓线
✓ 智能标签定位
✓ 科研风坐标轴
✓ 自适应比例标注

核心美化功能解析

功能1:核密度轮廓线

复制代码
kde = KernelDensity(bandwidth=0.5)kde.fit(coordinates)plt.contour(xx, yy, Z, levels=[peak*0.1]) 
  • 原理:通过核密度估计寻找细胞聚集区

  • 优势:比 convex hull 更贴合真实分布

功能2:智能标签

复制代码
ax.text(x, y, cell_type, bbox=dict(facecolor='white', alpha=0.9))
  • 自动计算亚群中位数坐标

  • 白色半透明背景增强对比度

  • 圆角边框提升美观度

功能3:科研风坐标轴​​​​​​​

复制代码
ax.arrow(x_min, y_min, dx, 0)  # X轴箭头ax.text(x_center, y_min-offset, 'UMAP1')  # 动态标签
  • 自动计算箭头长度比例

  • 自适应图像长宽比

  • 标签防遮挡设计

完整函数封装​​​​​​​

复制代码
import numpy as npimport pandas as pdimport scanpy as scimport matplotlib.pyplot as pltfrom sklearn.neighbors import KernelDensity

def enhance_umap(adata, color='celltype', figsize=(6,6)):    fig, ax = plt.subplots(figsize=figsize)    sc.pl.umap(        adata,        color=color,        legend_loc=None,        frameon=False,        size=15,        ax=ax,        add_outline=True,        show=False    )
    for cell_type in adata.obs[color].unique():        # 获取对应细胞类型的UMAP坐标        mask = adata.obs[color] == cell_type        x = adata.obsm["X_umap"][mask, 0]        y = adata.obsm["X_umap"][mask, 1]
        x_min, x_max = x.min() - 0.5, x.max() + 0.5        y_min, y_max = y.min() - 0.5, y.max() + 0.5        xx, yy = np.mgrid[x_min:x_max:100j, y_min:y_max:100j]
        xy_train = np.vstack([x, y]).T        xy_test = np.vstack([xx.ravel(), yy.ravel()]).T
        # 核密度估计        kde = KernelDensity(bandwidth=0.5, metric='euclidean')        kde.fit(xy_train)
        # 密度        Z = np.exp(kde.score_samples(xy_test))        Z = Z.reshape(xx.shape)
        # 绘制轮廓        plt.contour(            xx, yy, Z,             levels=[Z.max() * 0.1],             colors='gray',             linestyles='--',              linewidths=1.2,              alpha=0.75         )
    cell_type_counts = adata.obs[color].value_counts(normalize=True) * 100    for cell_type, percentage in cell_type_counts.items():        mask = adata.obs[color] == cell_type        x = np.median(adata.obsm["X_umap"][mask, 0])        y = np.median(adata.obsm["X_umap"][mask, 1])        ax.text(            # x, y, f"{cell_type} ({percentage:.1f}%)",            x, y, f"{cell_type}",            fontsize=10,             ha="center",             color="black",            bbox=dict(                facecolor='white',         # 添加白色背景                edgecolor='none',                 alpha=0.65,                boxstyle="round,pad=0.4"   # 添加圆角            )          )    ax = plt.gca()    ax.set_xlabel('UMAP1', fontsize=10)    ax.set_ylabel('UMAP2', fontsize=10)    # 获取坐标轴数据范围    x_min, x_max = ax.get_xlim()    y_min, y_max = ax.get_ylim()    # 动态计算箭头参数(基于数据范围和图像比例)    x_range = x_max - x_min    y_range = y_max - y_min    aspect_ratio = (fig.get_size_inches()[0] / fig.get_size_inches()[1]) * (y_range / x_range)  # 校正宽高比    # 箭头长度(数据范围的10%)    dx = x_range * 0.1 * aspect_ratio    dy = y_range * 0.1 * aspect_ratio  # 根据实际显示比例调整Y轴长度    # 箭头头部参数(与箭头长度成比例)    head_width = dy * 0.1    head_length = dx * 0.1    # 绘制X轴箭头    ax.arrow(        x_min, y_min,        dx, 0,        head_width=head_width,        head_length=head_length,        fc='black',        ec='black'    )    # 绘制Y轴箭头    ax.arrow(        x_min, y_min,        0, dy,        head_width=head_width,        head_length=head_length,        fc='black',        ec='black'    )    # 计算标签位置(箭头中点+微调偏移)    label_offset = dx * 0.15  # 偏移量为箭头长度的15%    ax.text(        x_min + dx/2,         y_min - label_offset,  # 向下偏移        'UMAP1',        ha='center',         va='top',         fontsize=10    )    ax.text(        x_min - label_offset,         y_min + dy/2,        'UMAP2',        rotation=90,        ha='right',         va='center',        fontsize=10    )
相关推荐
waoooqwe8 小时前
问卷样本真实吗
大数据·数据库·算法·数据分析
lisw058 小时前
泛函数、泛函分析的定义、应用与展望!
数据分析
2601_962966649 小时前
统计学专业应聘企业经营管理管培生,2027届校招的准备重点
大数据·数据分析
追风少年ii9 小时前
文献分享(xenium 5k)--跨物种单细胞肾脏表观基因组图谱揭示疾病中以上皮为主的衰老样状态
数据分析·空间·单细胞
for_ever_love__15 小时前
Pandas 基础——用 DataFrame 管理训练数据与实验记录
数据分析·pandas·大模型开发·dataframe
追风少年ii16 小时前
文献分享--人类面部多样性背后的细胞类型和调控元件图谱
数据分析·空间·单细胞
IT研究室16 小时前
最新大数据毕业设计选题推荐-基于大数据的北京市招标公告数据分析与可视化-大数据-Spark-Hadoop-Bigdata
大数据·数据分析·课程设计
paopaokaka_luck17 小时前
高校社团管理(AI辅助任务分配、协同过滤算法推荐、ECharts数据可视化、活动参与闭环、校园交流与反馈、器材借还管理)
java·前端·javascript·spring boot·数据分析·echarts
计算机毕业编程指导师17 小时前
【Python毕设选题推荐】基于Spark的国内主要农作物产量趋势分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·python·数据分析·spark·毕业设计·课程设计·农作物产量
lisw0518 小时前
概率论:事件之间的关系与运算!
数据分析·概率论