qmplot:为 PLINK 关联输出(或任何具有染色体、位置和 p 值的数据框)创建高质量的曼哈顿和 QQ 图。
项目描述
QMplot:一个 Python 工具,用于根据 GWAS 结果创建高质量的曼哈顿和 QQ 图。
qmplot是一个方便的、用户友好的工具和 Python 库,它允许直接从 PLINK 关联结果文件或任何包含染色体名称、染色体位置、P 值和可选列的数据框快速灵活地发布准备就绪的曼哈顿和 QQ 图SNP 名称(例如 dbSNP 中的 rsID)。
这个库的灵感来自 r-qqman,但它比r-qqman更方便的是染色体名称列不必再是数字,这意味着您可以保留染色体的原始名称而不必隐蔽的 X、Y、MT 等为 23、24、25 等。
依赖项
qmplot 支持 Python 3.6+,不再支持 Python 2。
安装需要numpy、 scipy、pandas 和matplotlib。
安装
qmplot由 Python 编写并在 PyPI 中发布。可以通过运行以下命令来安装最新的稳定版本:
pip install qmplot
快速开始
我们使用目录中的 PLINK2.x 关联输出数据“ gwas_plink_result.tsv ”tests/data作为下图的输入。这是“gwas_plink_result.tsv”的格式预览:
#CHROM POS ID REF ALT A1 TEST OBS_CT BETA SE T_STAT P
1 904165 1_904165 GAA 添加 282 -0.0908897 0.195476 -0.464967 0.642344
1 1563691 1_1563691 TGG 添加 271 0.447021 0.422194 1.0588 0.290715
1 1707740 1_1707740 TGG 添加 283 0.149911 0.161387 0.928888 0.353805
1 2284195 1_2284195 TCC 添加 275 -0.024704 0.13966 -0.176887 0.859739
1 2779043 1_2779043 TCT 添加 272 -0.111771 0.139929 -0.79877 0.425182
1 2944527 1_2944527 GAA 添加 276 -0.054472 0.166038 -0.32807 0.743129
1 3803755 1_3803755 TCT 添加 283 -0.0392713 0.128528 -0.305547 0.760193
1 4121584 1_4121584 AGG ADD 279 0.120902 0.127063 0.951511 0.342239
1 4170048 1_4170048 CTT 加 280 0.250807 0.143423 1.74873 0.0815274
qmplot应用两种方式生成曼哈顿图和 QQ 图:
1.命令行选项
如果您已经有 PLINK2.x 关联输出,这是绘制曼哈顿和 QQ 图的最简单方法。您可以直接键入qmplot --help
并会找到以下所有选项:
usage: qmplot [-h] -I INPUT -O OUTPREFIX [-T TITLE] [-P SIGN_PVALUE] [-M M_ID]
[--open-gui]
qmplot: Creates high-quality manhattan and QQ plots from PLINK association
output (or any dataframe with chromosome, position, and p-value).
optional arguments:
-h, --help show this help message and exit
-I INPUT, --input INPUT
Input file
-O OUTPREFIX, --outprefix OUTPREFIX
The prefix of output file
-T TITLE, --title TITLE
Title of figure
-P SIGN_PVALUE, --sign-mark-pvalue SIGN_PVALUE
Genome wide significant p-value sites. [1e-6]
-M M_ID, --top-sign-signal-mark-id M_ID
A string denoting the column name for which you want
to annotate the Top Significant SNPs. Default: "ID"(PLINK2.x)
--display Set to be GUI backend, which can show the figure.
以下命令将为您提供两个分辨率为 300 dpi 的 png 图:
$ qmplot -I data/gwas_plink_result.tsv -T Test -M ID --dpi 300 -O test
曼哈顿情节如下:
QQ图如下:
注意:您只能通过qmplot命令行选项修改绘图,当您想要进行更多更改时,这是一个很大的限制。
2.Python库
这是最灵活的方式。您可以在 Python 代码中使用 qmplot 作为库,并根据您的想法创建绘图。
具有默认参数的曼哈顿图
qmplot中的manhattanplot()函数采用数据框,其列包含染色体名称/id、染色体位置、P 值和可选的 SNP 名称(例如 dbSNP 中的 rsID)。
默认情况下,manhattanplot()根据 plink2 关联结果查找与 outout 对应的列名,即“#CHROM”、“POS”、“P”和“ID”,尽管用户可以指定不同的列名。使用 GWAS 数据框调用manhattanplot()函数作为单个参数绘制一个基本的曼哈顿图,默认为深蓝色和浅蓝色配色方案。
import pandas as pd
import matplotlib.pyplot as plt
from qmplot import manhattanplot
if __name__ == "__main__":
df = pd.read_table("tests/data/gwas_plink_result.tsv", sep="\t")
df = df.dropna(how="any", axis=0) # clean data
# generate manhattan plot and set an output file.
ax = manhattanplot(data=df)
plt.savefig("output_manhattan_plot.png")
通过设置旋转 x 轴刻度标签xticklabel_kws以避免标签重叠:
ax = manhattanplot(data=df,
# set vertical or any other degrees as you like.
xticklabel_kws={"rotation": "vertical"})
或者通过设置将标签旋转 45 度
xticklabel_kws={"rotation": 45}。
当使用默认参数运行时,该manhattanplot()函数在 $-log_{10}{(10^{-5})}$ 处绘制水平线,用于“暗示性”关联和 $-log_{10}{(5×10^{- 8})}$ 用于“全基因组显着”阈值。suggestiveline这些可以移动到不同的位置,或者分别使用参数和完全关闭genomewideline。
ax = manhattanplot(data=df,
suggestiveline=None, # Turn off suggestiveline
genomewideline=None, # Turn off genomewideline
xticklabel_kws={"rotation": "vertical"},
is_show=True) # display the plot in screen
manhattanplot当仅使用单个染色体的结果时,函数的行为会略有变化。在这里,不是在 x 轴上绘制交替的颜色和染色体 ID,而是在 x 轴上绘制 SNP 在染色体上的位置:
# plot only results of chromosome 8.
manhattanplot(data=df, CHR="chr8", xlabel="Chromosome 8")
plt.savefig("output_chr8_manhattan_plot.png")
manhattanplot()funcion 能够突出显示具有显着 GWAS 信号的 SNP 并注释具有最低 P 值的 Top SNP:
ax = manhattanplot(data=df,
sign_marker_p=1e-6, # highline the significant SNP with ``sign_marker_color`` color.
is_annotate_topsnp=True, # annotate the top SNP
xticklabel_kws={"rotation": "vertical"})
此外,突出显示感兴趣的 SNP 可以与限制为单个染色体相结合,以使“放大”到包含感兴趣的 SNP 的特定区域。
一个更好的曼哈顿情节的例子
可以将更多图形参数传递给manhattanplot()
函数来控制绘图标题、点字符、大小、颜色等。下面是示例:
import pandas as pd
from qmplot import manhattanplot
if __name__ == "__main__":
# loading data from local file
df = pd.read_table("tests/data/gwas_plink_result.tsv", sep="\t")
df = df.dropna(how="any", axis=0) # clean data
# defined the plot style
f, ax = plt.subplots(figsize=(12, 4), facecolor='w', edgecolor='k')
xtick = set(['chr' + i for i in list(map(str, range(1, 10))) + ['11', '13', '15', '18', '21', 'X']])
manhattanplot(data=data,
marker=".",
sign_marker_p=1e-6, # Genome wide significant p-value
sign_marker_color="r",
snp="ID",
title="Test",
xtick_label_set=xtick,
xlabel="Chromosome",
ylabel=r"$-log_{10}{(P)}$",
sign_line_cols=["#D62728", "#2CA02C"],
hline_kws={"linestyle": "--", "lw": 1.3},
is_annotate_topsnp=True,
ld_block_size=500000, # 500000 bp
text_kws={"fontsize": 12, # The fontsize of annotate text
"arrowprops": dict(arrowstyle="-", color="k", alpha=0.6)},
ax=ax)
plt.savefig("better.manhattan.png")
manhattanplot?通过在 IPython 控制台中键入来查找有关参数的更多详细信息。
带默认参数的 QQ 图
该qqplot()函数可用于生成 QQ 图,以可视化关联“P 值”的分布。该qqplot()函数将 P 值向量作为其唯一需要的参数。
import pandas as pd
from qmplot import qqplot
if __name__ == "__main__":
df = pd.read_table("tests/data/gwas_plink_result.tsv", sep="\t")
df = df.dropna(how="any", axis=0) # clean data
ax = qqplot(data=df["P"])
更好的QQ情节
可以传递更多图形参数qqplot()来控制绘图标题、轴标签、点字符、颜色、点大小等。下面是示例:
import pandas as pd
import matplotlib.pyplot as plt
from qmplot import qqplot
if __name__ == "__main__":
df = pd.read_table("tests/data/gwas_plink_result.tsv", sep="\t")
df = df.dropna(how="any", axis=0) # clean data
# Create a Q-Q plot
f, ax = plt.subplots(figsize=(6, 6), facecolor="w", edgecolor="k")
qqplot(data=data["P"],
marker="o",
title="Test",
xlabel=r"Expected $-log_{10}{(P)}$",
ylabel=r"Observed $-log_{10}{(P)}$",
ax=ax)
plt.savefig("test.QQ.png")
qqplot?通过在 IPython 控制台中键入来查找有关参数的更多详细信息。