如何用Scanpy/Python绘制分组的Leiden簇细胞占比堆叠柱状图?
实现两组样本Leiden簇占比堆叠柱状图的方法
前提说明
假设你的DataFrame结构如下(列名可根据实际情况调整):
| group | leiden | percentage |
|---|---|---|
| Average | 0 | 35.2 |
| Average | 1 | 28.7 |
| Average | 2 | 36.1 |
| High | 0 | 22.5 |
| High | 1 | 45.3 |
| High | 2 | 32.2 |
代码实现步骤
1. 导入所需库
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
2. 整理数据为宽格式
将长格式的DataFrame转换为宽格式,方便直接绘制堆叠柱状图:
# 假设你的DataFrame名为df wide_df = df.pivot(index='group', columns='leiden', values='percentage').fillna(0)
3. 绘制堆叠柱状图
# 设置绘图风格(可选,优化视觉效果) sns.set_style("whitegrid") # 创建画布和轴对象 fig, ax = plt.subplots(figsize=(8, 6)) # 绘制堆叠柱状图 wide_df.plot(kind='bar', stacked=True, ax=ax, colormap='tab20') # 调整图表样式 ax.set_title('Leiden簇细胞占比分布', fontsize=14) ax.set_xlabel('样本组', fontsize=12) ax.set_ylabel('细胞占比 (%)', fontsize=12) # 取消x轴标签旋转,提升可读性 ax.set_xticklabels(wide_df.index, rotation=0) # 将图例移至图表右侧,避免遮挡 ax.legend(title='Leiden簇', bbox_to_anchor=(1.05, 1), loc='upper left') # 可选:在每个堆叠块上显示百分比数值 for p in ax.patches: width, height = p.get_width(), p.get_height() x, y = p.get_xy() if height > 0: ax.text(x + width/2, y + height/2, f'{height:.1f}%', ha='center', va='center') plt.tight_layout() plt.show()
关键参数与自定义建议
stacked=True:开启堆叠模式,将同一组内的不同簇占比堆叠展示colormap='tab20':适合区分多簇的调色板,簇数量少时可改用tab10;也可通过color参数手动指定颜色列表- 若Leiden列存储的是细胞类型名称,直接替换代码中的
leiden为对应列名即可 - 调整
figsize参数可修改图表宽高比例,适配不同展示场景
内容的提问来源于stack exchange,提问作者Quentin Chartreux
相关产品推荐
相关产品推荐

