Py学习  »  Python

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

生信技能树 • 8 月前 • 321 次点击  

前面我们给大家分享了一个超详细的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.95100)
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