如何用Python基于pandas数据框绘制指定基因对上色的矩阵图
你要的这种基因对矩阵热图,pandas本身没有内置的直接绘制接口,一般配合seaborn库实现,操作非常简单,步骤如下:
实现逻辑
首先把原始的基因对数据表转换为行列都是基因名的邻接矩阵,不存在的基因对对应位置填为NaN,绘图时NaN位置默认留空,仅对有数值的单元格按数值大小上色即可。
完整可运行代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import numpy as np # 1. 预处理原始数据 # 示例数据构造,你实际使用时替换为pd.read_csv读取你的文件即可 df = pd.DataFrame({ 'gene1': ['TP53.', 'TP53.', 'IDH1.'], 'gene2': ['FUBP1', 'CIC', 'NF1'], 'pvalue': [6.381282e-09, 1.570489e-22, 1.946551e-05], 'qvalue': [2.435575e-08, 7.055298e-22, 7.116265e-05] }) # 去掉基因名末尾多余的小数点 df['gene1'] = df['gene1'].str.strip('.') df['gene2'] = df['gene2'].str.strip('.') # 2. 构造空白基因矩阵 all_genes = pd.unique(pd.concat([df['gene1'], df['gene2']])) gene_matrix = pd.DataFrame(np.nan, index=all_genes, columns=all_genes) # 3. 填充矩阵数值,这里用qvalue的负对数上色,数值越大显著性越强 for _, row in df.iterrows(): g1, g2, q_val = row['gene1'], row['gene2'], row['qvalue'] # 对称填充,适合无方向的基因对关系;如果是有向关系删掉下面第二行即可 gene_matrix.loc[g1, g2] = -np.log10(q_val) gene_matrix.loc[g2, g1] = -np.log10(q_val) # 4. 绘制矩阵图 plt.figure(figsize=(6, 6)) sns.heatmap( gene_matrix, cmap='Reds', # 可自定义配色,比如Blues、viridis都可以 annot=True, # 不需要显示单元格数值的话改成False即可 fmt='.1f', cbar_kws={'label': '-log10(qvalue)'}, square=True, # 保证单元格是正方形,和示例效果一致 linewidths=0.5 # 加单元格分隔线,可根据需求调整 ) plt.xlabel('Gene name') plt.ylabel('Gene name') plt.xticks(rotation=45) plt.yticks(rotation=0) plt.tight_layout() plt.show()
可调参数说明
- 如果要按pvalue上色,把填充时的
row['qvalue']改成row['pvalue']即可 - 不需要显示数值直接删掉
annot=True和fmt='.1f'两个参数即可 - 要修改单元格颜色只需要替换
cmap参数的取值即可
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

