通常在做数据分析的时候需要判断一下不同细胞类型/成分在样本或者分组中的数量和百分比,那么气泡图也是其中一种实用的方式。在R语言中一般会采用gplots::balloonplot去实现这个过程,而Python中可使用seaborn进行绘制。
# 有一些可能不需要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
os.getcwd()
# 读取数据
adata = sc.read_h5ad('1-DataPre/sce.all.h5ad')
# 提取想要的分组信息和细胞类型
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")
# 绘制频数气泡图
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()
# 制作百分比表
# 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")
# 绘制百分比气泡图
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()
这个图就没有改变颜色了,若需要改变颜色可以按照上面的图的代码进行修改。
注:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多相关内容可关注公众号:生信方舟
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。