曼哈顿图的原理学习和python实现绘制

14 篇文章 2 订阅
3 篇文章 0 订阅

1、简介

曼哈顿图是GWAS(全基因组关联分析)的一个分析工具。

在曼哈顿图中,我们可以设置阈值,找到数据中和表型有强关联性的SNPs。

曼哈顿图的本质是散点图,不过对于不同的染色体,用不同颜色进行区分。图中的X轴是各个SNPs的数据索引,Y轴是对应的P值的取-log10的对数值。

对P值进行对数转换,原本越小的P值会变得很大,而很大和略大的P值则是变得很小,这样更容易突显出有价值的P值和对应的染色体。

2、P值的概念

P值由统计学根据显著性检验方法所得到。

p值是将观察结果认为有效即具有总体代表性的犯错概率,如p=0.05提示样本中变量关联有5%的可能是由于偶然性造成的。(这并不是说如果变量间存在关联,我们可得到5%或95%次数的相同结果,当总体中的变量存在关联,重复研究和发现关联的可能性与设计的统计学效力有关。

一般以P < 0.05 为有统计学差异, P<0.01 为有显著统计学差异,P<0.001为有极其显著的统计学差异。

3、实现曼哈顿图的python代码

使用的数据,由R包qqman里附带的数据做为绘图数据:

实现的代码:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
 
#读取GWAS结果,至少要包含 染色体号(CHR),P值(p.value),以及确保snp被正确排序
gwas_data = pd.read_csv(r'gwas.txt',sep=",")
 
#构建一个辅助列,作为各个snp在曼哈顿图x轴上的坐标
gwas_data["i"]=gwas_data.index
print(gwas_data.index)
list_=[i for i in range(1,15)]
list_ += ['16', '18', '20', '22']
xtick = ['chr'+c for c in map(str,list_)]


# (optional) 如果p值没有转换成 -log10(p) 那么需要
gwas_data["-LOG10_P"]=-np.log10(gwas_data["P"])
 
#开始做图:
plot = sns.relplot(data=gwas_data, x='i', y='-LOG10_P', aspect=2.3,\
                   hue='CHR', palette = 'dark', s=4, legend=None) 
 
#处理x轴上每个chr标注的位置,这里使用每条染色体上SNP索引的中间值
chrom_df=gwas_data.groupby('CHR')['i'].median()
 
#在上一步计算得到的位置添加x轴的刻度和标注
plot.ax.set_xticks(chrom_df)
plot.ax.set_xticklabels(chrom_df.index)
 
#最后添加各种标注,作为阈值的判断线,调整图像Y轴范围
plot.ax.set_xlabel('CHR')
plot.fig.suptitle('Manhattan plot')
plot.ax.axhline(y=-np.log10(5e-8), linewidth = 2,linestyle="--",color="orange")
plot.ax.set_ylim(0,20)

#保存图片
plt.savefig('manhattan.png')

图片效果

 这里数据多,图片面积小,会出现表示P值的点堆积在同一个X轴刻度的错觉。实际上,一个点表示一个SNP(碱基),对应一个P值。

补充,关于matplotlib做出的图Y轴的标签被遮住的问题

这个问题用plt.figure(figsize=(w,h))不能解决,修改画布的W和H,图像也会跟着缩放。但还是可以用如下的方法调整:

plt.show()

在如图圈出的红框中,进行调整,可对图像位置进行调整,最后在保存,就可以解决Y轴标签被遮住的问题。

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
曼哈顿(Manhattan plot)是一种用于可视化高通量数据中的关联性分析结果的形。在 Python 中,我们可以使用 Matplotlib 库和 Pandas 库来绘制曼哈顿。 下面是一个简单的示例代码,用于绘制曼哈顿: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt # 生成随机数据 np.random.seed(42) data = pd.DataFrame({'chromosome': ['chr{}'.format(i) for i in range(1, 23)] * 10, 'position': np.sort(np.random.randint(0, 10000000, 220)) + np.repeat(np.arange(0, 220, 22), 10), 'pvalue': np.random.rand(220)}) # 计算每个染色体上的 SNP 的 -log10(p-value) data['logp'] = -np.log10(data['pvalue']) # 绘制曼哈顿 fig, ax = plt.subplots(figsize=(10, 6)) colors = {'chr1': 'r', 'chr2': 'b', 'chr3': 'g', 'chr4': 'c', 'chr5': 'm', 'chr6': 'y', 'chr7': 'k', 'chr8': 'orange', 'chr9': 'gray', 'chr10': 'purple', 'chr11': 'brown', 'chr12': 'pink', 'chr13': 'olive', 'chr14': 'navy', 'chr15': 'teal', 'chr16': 'gold', 'chr17': 'orchid', 'chr18': 'indigo', 'chr19': 'peru', 'chr20': 'sienna', 'chr21': 'tan', 'chr22': 'maroon'} for i, (chrom, group) in enumerate(data.groupby('chromosome')): ax.scatter(group['position'], group['logp'], color=colors[chrom], label=chrom, alpha=0.5, edgecolors='none') ax.axhline(y=-np.log10(0.05/len(data)), linestyle='--', color='k') ax.set_xlabel('Position') ax.set_ylabel('-log10(p-value)') ax.legend(title='Chromosome', loc='center left', bbox_to_anchor=(1, 0.5)) plt.show() ``` 这段代码首先生成了一个包含随机数据的 Pandas DataFrame,然后计算了每个染色体上的 SNP 的 -log10(p-value)。接着,使用 Matplotlib 库来绘制曼哈顿。在这个示例中,我们使用散点绘制每个 SNP 的位置和 -log10(p-value),并使用不同的颜色来表示不同的染色体。同时,我们还添加了一个水平线,用于标识显著性水平(在这个示例中,显著性水平为 0.05/220,即 Bonferroni 校正后的显著性水平)。最后,我们添加了一些标签和例,用于增加形的可读性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄思博呀

真的有人打赏啊,超级感谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值