社区所有版块导航
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

(IF=50.0/Q1)顶刊python代码学习(二):细胞类型初始注释

生信技能树 • 1 年前 • 489 次点击  

前面我们给大家分享了一个超详细的python文献代码:(IF=50.0/Q1)顶刊杂志的python代码复现资源分享,今天就来学习它!势必要拿下!想进python群一起学习交流的加我微信:Biotree123。文献标题为:《Regenerative lineages and immune-mediated pruning in lung cancer metastasis》。

回顾

单细胞数据上传到了GEO数据库:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE123902

注释后的文件:

https://s3.amazonaws.com/dp-lab-data-public/lung-development-cancer-progression/PATIENT_LUNG_ADENOCARCINOMA_ANNOTATED.h5

https://s3.amazonaws.com/dp-lab-data-public/lung-development-cancer-progression/MOUSE_LUNG_ADENOCARCINOMA_METASTASIS_ANNOTATED.h5

代码下载的地方:https://github.com/dpeerlab/lung-development-cancer-progression

如有文件和代码下载困难,可加微信:Biotree123来获取~

第一篇:(IF=50.0/Q1)顶刊python代码学习(一):数据背景,环境配置与数据加载

Note:

下面一些代码会比较长,代码里面给了一个 ipynb 的文件,直接在上面运行即可,不需要复制这里面的。我们这里简单做一些代码解读,还有运行不成功的代码更新,确保都能正常运行。

今天的学习内容:

附图2中的d/e/h. h图主要对细胞进行初始大类注释,所有细胞最初被分配到三个大细胞类别之一:淋巴细胞、髓样细胞和上皮细胞/基质细胞类型。这种分配是根据细胞对经典免疫细胞、髓样细胞、间充质细胞和上皮细胞标记物的表达情况进行的。

1)加载数据

见稿子:(IF=50.0/Q1)顶刊python代码学习(一):数据背景,环境配置与数据加载

2)评估库参数

设置绘图参数:

# exec 是 Python 的内置函数,用于执行存储在字符串或对象中的 Python 代码。
exec('QUERY = DF_{}'.format(subset_type))

plt.figure(figsize = (9,3)) # 设置图形的宽度为 9 英寸,高度为 3
gs1 = gridspec.GridSpec(1,3) # 创建一个 1 行 3 列的网格布局,即总共可以放置 3 个子图。
gs1.update(wspace=0.5 , hspace=0.7) # set the spacing between axes. 设置子图之间的水平间距为 0.5,垂直间距为 0.7。

子图1:注意这里的代码更新

在 Python 的 pandas 库中,DataFrame 对象并没有 select 方法。你可能想使用的是 loc 或 iloc 方法来选择数据。select 方法是 pandas 早期版本中的方法,但在较新的版本中已经被废弃。

# (1) PLOT LOG10 LIBRARY SIZE
ax = plt.subplot(gs1[0])
bins = np.linspace(np.log10(QUERY.values.sum(axis=1).min()), np.log10(QUERY.values.sum(axis=1).max())*0.95, 100)
for ind, label in enumerate(np.unique(QUERY.index.get_level_values('Legend'))):
    # 选择对应于 'Legend' 级别为 label 的行
# x = np.log10(QUERY.select(lambda x: x[1] in label).values.sum(axis=1)) # log cell size, 原来的代码,修改为下面的
    x = np.log10(QUERY.loc[QUERY.index.get_level_values('Legend') == label].values.sum(axis=1))  # log cell size ,修改后的
# plt.hist(x, bins, alpha=0.5, label=label,color = np.divide(tuple(hex(FLATUI_SAMPLE[ind]).rgb),255))  # 这里缺少一个colors的库,网络上找不到,就不设置颜色了
    plt.hist(x, bins, alpha=0.5, label=label)
plt.xticks(rotation=70)
plt.ylabel('Frequency')
plt.xlabel('\nLog10 Cell Size')
plt.grid(True)
sns.despine()

子图2:

# (2) PLOT LOG NUM UNIQUE GENES
ax = plt.subplot(gs1[1])
bins = np.linspace(np.log10((np.sum(QUERY > 0,axis=1)).min()), 
                   np.log10((np.sum(QUERY > 0,axis=1)).max())*0.95, 100)
for ind, label in enumerate(np.unique(QUERY.index.get_level_values('Legend'))):
    # x = np.log10(np.sum(QUERY.select(lambda x: x[1] in label) > 0,axis=1))
    # plt.hist(x, bins, alpha=0.5, label=label,color = np.divide(tuple(hex(FLATUI_SAMPLE[ind]).rgb),255))
    subset = QUERY.loc[QUERY.index.get_level_values('Legend') == label]
    x = np.log10(np.sum(subset > 0, axis=1))  # log number of unique genes
    plt.hist(x, bins, alpha=0.5, label=label) 
plt.xticks(rotation=70)
plt.ylabel('Frequency')
plt.xlabel('\nLog10 Unique genes')
plt.grid(True)
sns.despine()

子图3:

# (3) PLOT LOG NUMBER OF CELLS CONTRIBUTING TO EACH GENE
ax = plt.subplot(gs1[2])
data = np.log10(np.sum(QUERY.values > 0,axis=0))
bins = np.linspace(0, data.max()*0.95, 20)
for ind, label in enumerate(np.unique(QUERY.index.get_level_values('Legend'))):
    # x = np.log10(np.sum(QUERY.select(lambda x: x[1] in label) > 0,axis=0))
    # x[(np.isinf(x)) | (np.isnan(x))] = 0
    # plt.hist(x, bins, alpha=0.5, label=label,color = np.divide(tuple(hex(FLATUI_SAMPLE[ind]).rgb),255)) 
    # 选择对应于 'Legend' 级别为 label 的行
    subset = QUERY.loc[QUERY.index.get_level_values('Legend') == label]
    x = np.log10(np.sum(subset.values > 0, axis=0))
    x[(np.isinf(x)) | (np.isnan(x))] = 0  # 处理无穷大和NaN值
    plt.hist(x, bins, alpha=0.5, label=label) 
plt.xticks(rotation=70)
plt.ylabel('Frequency')
plt.xlabel('\nLog. Cells/Gene')
plt.grid(True)
sns.despine()

三张图的代码放在一起运行得到的结果拼图:

这三个图分别展示了每个细胞中总umi数,每个细胞中表达的基因数,前两者的比值。不同颜色表示不同样本。

3)初始大类注释

1.读取细胞marker

数据在 CELL_TYPES_WANSLEEBEN_HOGAN_2013.csv 表格,作者在提供的代码data文件夹里面有:

# 从一个 Excel 文件中加载标准的细胞类型标记基因。
# 这个文件对应于 SUPPLEMENTARY_TABLE2/TAB1 (Gene Signatures from ED Fig. 1i)
genesets = pd.read_csv('./data/CELL_TYPES_WANSLEEBEN_HOGAN_2013.csv',header='infer') # 让 pandas 自动推断文件的头部行(通常是第一行)作为列名
print(genesets.shape[1])  # 输出多少列
genesets

2.生成每个细胞类型基因集中所有基因表达总和的打分矩阵:

# ROW INDEX
meta = 'META_CELL_TYPE'
FLATUI_PLOT = FLATUI_METACELL
title = os.path.basename(path_to_genesets)[:-4] # 从 genesets 数据框中提取所有列名,这些列名对应不同的细胞类型
title 

# QUERY 为INDF_ALL
# GENERATE MATRIX OF CUMULATIVE EXPRESION PER CELL TYPE
exec('QUERY = INDF_{}'.format(subset_type))
titles = list(genesets.columns)#['EPITHELIAL','MESENCHYAL','CD45']
tmp = pd.DataFrame(index = QUERY.index) # 初始化一个空的 DataFrame,其索引与 QUERY 相同

# 循环:对于每个细胞类型(title),从 genesets 中提取对应的基因列表,过滤掉 NaN 值,并找出这些基因在 QUERY 中的交集。然后计算这些基因在每个细胞中的累积表达值,并将结果存储在 tmp 数据框中。
for title in titles:
    genes = genesets.values[:,np.where(genesets.columns==title)[0][0]] # genes x pathways
    genes = [x for x in genes if str(x) != 'nan']
    detected_genes = list(set(genes).intersection(set(QUERY.columns)))
    vals = QUERY[detected_genes]
    exec('tmp[\'{}_SCORE\'] = (np.nansum(vals,axis=1))'.format(title))
genes = list(tmp.columns)

第三步的颜色设置去掉了。

4. 构建热图数据

对上面的基因集累积表达值进行了归一化处理:进行标准化(Z-score)

# CONSTRUCT HEATMAP DATA
heatmap_data = pd.DataFrame(data = zscore(tmp.values,axis=0),columns = genes)
# yticks 和 xticks:分别存储热图的行和列标签。
yticks = heatmap_data.index
xticks = heatmap_data.columns
heatmap_data 

5.对上面的归一化值进行行列聚类

# LINKAGE 
method = 'average' # average, single
metric = 'cosine' # cosine
linkage = hc.linkage(heatmap_data, method=method, metric = metric)
row_linkage = deepcopy(linkage)
linkage = hc.linkage(heatmap_data.T, method=method, metric = metric)
col_linkage = deepcopy(linkage)

# 对热图按照上面的聚类结果重新进行排序
r1 = hc.leaves_list(row_linkage)
cl = hc.leaves_list(col_linkage)
mat = heatmap_data.iloc[r1,cl]
mat

行列已经发生了变化。

6.绘制聚类标记热图

颜色设置的地方注释掉了。

# VIEW CLUSTERED LABELED HEATMAP AND DENDROGRAM 
fig = plt.figure(figsize=(18,10))

# ADD ROW COLOR INDEX (CELL OF ORIGIN)
ax1 = fig.add_axes([0.088,0.1,0.01,0.6]) # [x0,y0,width,height]
x = 0
y = 0
# for c in row_colors[r1]:
#     pos = (x, y / len(r1))
#     ax1.add_patch(patches.Rectangle(pos, 1, 1 / len(r1), color=c))
#     if y >= len(r1)-1:
#         x += 1
#         y = 0
#     else:
#         y += 1
# plt.axis('off')

# ADD MATRIX WITH GENE NAMES
axmatrix = fig.add_axes([0.1,0.1,0.7,0.6])
im = axmatrix.matshow(mat, aspect='auto', origin='lower', cmap=plt.cm.RdBu_r,vmin=-3,vmax=3)
labels = list(mat.columns)
axmatrix.xaxis.set_ticks_position('bottom')
axmatrix.set_yticklabels([]);
xtick = plt.xticks(range(len(labels)), labels, rotation = 90, fontsize = 14)

# ADD DENDROGRAM
sch.set_link_color_palette(['#808080', '#808080', '#808080', '#808080','#808080','#808080','#808080'])
ax2 = fig.add_axes([0.01,0.1,0.08,0.6]) # [x0,y0,width,height]
Z1 = sch.dendrogram(row_linkage, orientation='left',above_threshold_color='#808080')
ax2.set_xticks([])
ax2.set_yticks([])
plt.axis('off')

# ADD COLORBAR
axcolor = fig.add_axes([0.81,0.1,0.01,0.6])
cbar = plt.colorbar(im, cax=axcolor)
cbar.ax.get_yaxis().set_ticks([])

# 保存生成的热图为图像文件
figure_label = 'heatmaps/user_defined/_{}_{}_HEATMAP_{}_{}_{}'.format(meta,subset_type,title,method,metric)
fn = FIG_output_stem + FN.replace(".h5", "") + figure_label 
d = os.path.dirname(fn)
ifnot os.path.exists(d):
    os.makedirs(d)
    
fig.savefig(fn + '.png', bbox_inches='tight',dpi=fig_dpi)
print(fn)

感觉没有必要这么复杂呀,经典的细胞类型很容易就区分出:淋巴细胞、髓样细胞和上皮细胞/基质细胞类型。

今天分享到这~

(未完待续)

如果上面的代码学习对你来说有困难,可以看看下面的链接!


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/186568