首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数量和比例气泡图学习(Python版)

数量和比例气泡图学习(Python版)

原创
作者头像
凑齐六个字吧
发布2025-07-28 15:39:21
发布2025-07-28 15:39:21
8900
代码可运行
举报
运行总次数:0
代码可运行

通常在做数据分析的时候需要判断一下不同细胞类型/成分在样本或者分组中的数量和百分比,那么气泡图也是其中一种实用的方式。在R语言中一般会采用gplots::balloonplot去实现这个过程,而Python中可使用seaborn进行绘制。

分析流程
1.导入
代码语言:javascript
代码运行次数:0
运行
复制
# 有一些可能不需要import,但是懒得删去了
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import scanpy as sc
import numpy as np
import anndata as ad
import pooch
import os
2.读取数据
代码语言:javascript
代码运行次数:0
运行
复制
os.getcwd()
代码语言:javascript
代码运行次数:0
运行
复制
# 读取数据
adata = sc.read_h5ad('1-DataPre/sce.all.h5ad')
3.提取分组信息和细胞类型
代码语言:javascript
代码运行次数:0
运行
复制
# 提取想要的分组信息和细胞类型
x = adata.obs["project"]
y = adata.obs["celltype"]

# 构建 DataFrame
df = pd.DataFrame({'x': x, 'y': y})

# 频数表
tbl = pd.crosstab(df['x'], df['y'])

# 保存频数表 CSV
tbl.to_csv(f"{prefix}-table.csv")
4.绘制频数气泡图
代码语言:javascript
代码运行次数:0
运行
复制
# 绘制频数气泡图
plt.figure(figsize=(10, 10))
plot_data = tbl.stack().reset_index() # .stack():把列名“压缩”成一列;.reset_index():将原来的行索引变为列。
plot_data.columns = ['x', 'y', 'count']
sns.scatterplot(
    data=plot_data,
    x='x', y='y',
    hue='x',                     # 根据细胞类型上色(也可以改为 'x' 按分组上色)
    palette='Set2',              # 设置配色方案(可换成 'tab10', 'pastel', etc.)
    size='count', 
    sizes=(100, 2000), #控制气泡的最大和最小的大小
    legend=  False,  #是否需要显示右边的size图例,可以是'auto', 'brief', 'full', or a boolean.
    alpha=0.6 #气泡透明度
)

# 添加具体数字标签(频数)
for _, row in plot_data.iterrows():
    plt.text(row['x'], row['y'], int(row['count']),
                 ha='center', va='center', # ha='center', va='center' 保证数字在气泡中心;
                 fontsize=9, 
                 color='black')
    
plt.title('Cell Type Count per Group')
plt.xticks(rotation=90)
plt.tight_layout()
plt.savefig(f"{prefix}-table.pdf")
plt.show()
5.制作百分比表
代码语言:javascript
代码运行次数:0
运行
复制
# 制作百分比表
# tbl.sum(axis=1):按行求和,也就是每组(如 Sample1)的总细胞数;tbl.div(..., axis=0):把每个单元格除以所在行的总和,即按行标准化
percent_tbl = tbl.div(tbl.sum(axis=1), axis=0) * 100
percent_tbl = percent_tbl.round(2)
percent_tbl.to_csv(f"{prefix}-percent-table.csv")
6.绘制百分比气泡图
代码语言:javascript
代码运行次数:0
运行
复制
# 绘制百分比气泡图
plt.figure(figsize=(10, 10))
plot_percent = percent_tbl.stack().reset_index()
plot_percent.columns = ['x', 'y', 'percent']
sns.scatterplot(
    data=plot_percent,
    x='x', y='y',
    size='percent', 
    sizes=(100, 1000), 
    legend=False, 
    alpha=0.6
)
    
# 添加具体数字标签(百分比)
for _, row in plot_percent.iterrows():
    plt.text(row['x'], row['y'], f"{row['percent']}%",
                ha='center', va='center', 
             fontsize=9, color='black')
    
plt.title('Cell Type Percent per Group')
plt.xticks(rotation=90)
plt.tight_layout()
plt.savefig(f"{prefix}-percent-table.pdf")
plt.close()

这个图就没有改变颜色了,若需要改变颜色可以按照上面的图的代码进行修改。

参考资料
  1. seborn github: https://github.com/mwaskom/seaborn

:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多相关内容可关注公众号:生信方舟

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析流程
    • 1.导入
    • 2.读取数据
    • 3.提取分组信息和细胞类型
    • 4.绘制频数气泡图
    • 5.制作百分比表
    • 6.绘制百分比气泡图
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档