社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python单细胞学习笔记-day7

生信技能树 • 3 月前 • 90 次点击  

前面,我们生信技能树的讲师小洁老师与萌老师新开了一个学习班:《掌握Python,解锁单细胞数据的无限可能》,身为技能树的一员,近水楼台先得月,学起!下面是我的学习笔记,希望可以给你带来一点参考

今天继续学习视频:python_day6剩余部分和python_day7视频 !一口气学完吧!

续:python单细胞学习笔记-day6

6.2 marker基因可视化

细胞cluster注释,搜集的已知细胞类型的marker基因:

CD4 T
IL7R
CD14+ Mono
CD14
CD14+ Mono
LYZ
B
MS4A1
CD8 T
CD8A
NK
GNLY
NK
NKG7
FCGR3A+ Mono
FCGR3A
FCGR3A+ Mono
MS4A7
DC
FCER1A
DC
CST3
Platelet
PPBP

读取进来:

# 读取
df = pd.read_table("markers.txt",header=None)
# 添加列名
df.columns = ['Cell_Type''Marker']
# 创建字典,其中每个细胞类型对应一个标记基因列表
markers = df.groupby('Cell_Type')['Marker'].apply(list).to_dict()
markers
# 绘图
sc.pl.dotplot(adata, markers, groupby='leiden',figsize=(15,4),var_group_rotation=0)

小提琴图:

sc.pl.violin(adata,['PPBP','MS4A1','CD8A'],'leiden')

堆叠小提琴图:

sc.pl.stacked_violin(adata, markers, groupby = "leiden",figsize= (16,7),var_group_rotation=0

热图:

sc.pl.heatmap(adata, markers, groupby='leiden', var_group_rotation=True,figsize=(12,6))

热图2:

sc.pl.matrixplot(adata, markers, groupby='leiden',figsize=(12,2),var_group_rotation= 0)

track图:每一条竖线代表一个细胞,线的高度表示基因在细胞中的表达水平

sc.pl.tracksplot(adata,markers,'leiden',figsize=(15,4))

7.细胞类型注释

使用官网的定义:




    
new_cluster_names = {
    '0'"CD4 T",
    '1'"B",
    '2'"FCGR3A+ Mono",
    '3'"NK",
    '4'"CD8 T",
    '5'"CD14+ Mono",
    '6'"DC",
    '7'"Platelet"
}
# adata.rename_categories("louvain", new_cluster_names)
adata.obs['leiden'] = adata.obs['leiden'].map(new_cluster_names)
adata.obs['leiden'

7.1 注释后的umap图

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(77))

# 使用 scanpy.pl.umap() 绘制 UMAP 图,并将图形绘制到指定的 Axes 对象上
sc.pl.umap(adata, color='leiden', legend_loc='on data',
           frameon=False, legend_fontsize=10, legend_fontoutline=2,
           add_outline=True, palette="Set1", ax=ax)
# 显示图表
plt.show()

7.2 umap图美化

用seaborn美化umap图

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

umap_df = pd.DataFrame({
    'UMAP_1': adata.obsm['X_umap'][:, 0],
    'UMAP_2': adata.obsm['X_umap'][:, 1],
    'Cluster': adata.obs['leiden']
})

plt.figure(figsize=(55))

# 使用 seaborn 绘制散点图,按 Cluster 着色
sns.scatterplot(
    data=umap_df,
    x='UMAP_1',
    y='UMAP_2',
    hue='Cluster',
    palette='Set1',
    alpha=0.5,
    legend=None # 不显示默认图例
)

# 计算每个 Cluster 的中心点并添加标签
unique_labels = umap_df['Cluster'].unique()
for label in unique_labels:
    label_coords = umap_df[umap_df['Cluster'] == label]
    center_x = label_coords['UMAP_1'].mean()
    center_y = label_coords['UMAP_2'].mean()
    plt.text(center_x, center_y, label, fontsize=12, ha='center', va='center')

# 图片设置
plt.grid(False)
plt.title('UMAP Plot with Cluster Labels', fontsize=14)
plt.xlabel('UMAP 1', fontsize=12)
plt.ylabel('UMAP 2', fontsize=12)
plt.show()

7.3 保存数据

adata.write("pbmc3k_anno.h5ad")

任意分组的差异分析及其可视化

1.加载前面注释好的数据

import scanpy as sc
adata = sc.read_h5ad("pbmc3k_anno.h5ad")
adata

2.提取CD4/CD8 Tcell细胞

adata_subset = adata[adata.obs['leiden'].isin(['CD4 T''CD8 T'])].copy()
adata_subset.obs['cell_type'] = adata_subset.obs['leiden'].copy()
sc.pl.umap(adata_subset,color = 'cell_type')
image-20250314170513909

3.找CD4 T细胞和CD8 T细胞之间差异表达的基因

Note:reference是指定对照组

sc.tl.rank_genes_groups(adata_subset, groupby="cell_type", reference="CD8 T",method="wilcoxon",pts=True)
sc.pl.rank_genes_groups_dotplot(
    adata_subset, standard_scale="var", n_genes=10
)

查看得到的差异结果并整理:

# 查看
adata_subset.uns['rank_genes_groups']

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 提取差异分析结果并构建 DataFrame
df = pd.DataFrame({
    'gene': adata_subset.uns['rank_genes_groups']['names']['CD4 T'],  # CD4 T 的基因
    'log2FC': adata_subset.uns['rank_genes_groups']['logfoldchanges']['CD4 T'],  # log2 fold change
    'pval': adata_subset.uns['rank_genes_groups']['pvals']['CD4 T'],
    'pvals_adj': adata_subset.uns['rank_genes_groups']['pvals_adj']['CD4 T']# p 值
})

# 数据整理
df['-log10(pval)'] = -np.log10(df['pval'])  # 计算 -log10(pval)
print(df.head())

# 得到pct
pts = pd.DataFrame({'pct.1': adata_subset.uns['rank_genes_groups']['pts']['CD4 T'],
'pct.2': adata_subset.uns['rank_genes_groups']['pts']['CD8 T']}).reset_index().rename(columns={'index''gene'})
pts

# 两者合并
df = df.merge(pts,on = 'gene')
df

设置阈值挑选上下调:




    
# 设置阈值
log2fc_threshold = 0.58
pval_threshold = 0.05

k1 =  (df['log2FC'] > log2fc_threshold) & (df['pval'] < pval_threshold) #上调
k2 =  (df['log2FC'] < -log2fc_threshold) & (df['pval'] < pval_threshold) #下调
k1.value_counts(),k2.value_counts()

# 增加一列上下调
import pandas as pd
df['change'] = df['log2FC'].case_when([
    (k1 , "up"),
    (k2 , "down"),
    (pd.Series(True), "stable")
])

print(df.head())

# 统计差异个数
df.change.value_counts()

4.绘制火山图

plt.figure(figsize=(86))
sns.scatterplot(
    data=df,
    x='log2FC',
    y='-log10(pval)',
    hue='change',  # 根据显著性分类上色
    palette={ 'up''red''down''blue''stable''grey'},
    alpha=0.7,
    s=40# 点大小
)
plt.axhline(-np.log10(pval_threshold), color='black', linestyle='--', linewidth=0.8)
plt.axvline(log2fc_threshold, color='black', linestyle='--', linewidth=0.8)
plt.axvline(-log2fc_threshold, color='black', linestyle='--', linewidth=0.8)

plt.title('Volcano Plot', fontsize=16)
plt.xlabel('log2 Fold Change', fontsize=12)
plt.ylabel('-log10(p-value)', fontsize=12)
plt.legend(title='Significance', fontsize=10)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()

今天学习到这里~

文末友情宣传


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/180025
 
90 次点击