曼哈顿图本质上是一个散点图,用于显示大量非零大范围波动数值,最早应用于全基因组关联分析(GWAS)研究展示高度相关位点。近几年,在宏基因组领域,尤其是差异OTU结合分类学结果,采用 Manhattan plot 展示有非常好的效果,倍受推崇。
大数据中,即展示数据全貌,又能快速找到目标基因或 OTU,同时可知目标的具体位置和分类、显著程度等信息。绝对高端大气,而且还有内涵。
数据坐标轴介绍,以下图 GWAS 研究结果为例:
R 语言(ggplot2,qqman)、Python(geneview)都能绘制曼哈顿图。本文主要介绍如何使用 R 语言中的 qqman 包绘制 GWAS 研究的 Manhattan 图。
qqman 是一个使用 Q-Q(应用 qq() 函数) 和 manhattan plots(应用 manhattan() 函数) 对 GWAS 分析结果进行可视化的 R 包。
The qqman package includes functions for creating manhattan plots (the manhattan() function) and Q-Q plots (with the qq() function) from GWAS results. The gwasResults data.frame included with the package has simulated results for 16,470 SNPs on 22 chromosomes in a format similar to the output from PLINK.
在 R 中安装 qqman :
install only onceinstall.packages("qqman")# load every time you use itlibrary(qqman)
qqman 包中的 gwasResults 数据结构包含了一共 22 条染色体 16470 个 SNP 的 GWAS 模拟结果数据,该数据共4列,分别是:SNP id,染色体编号,SNP 坐标,P value;如下所示(范例的 SNP 坐标是连续的,但真实的 SNP 数据的坐标可能是断续的,但不会影响绘图):
str(gwasResults) 'data.frame': 16470 obs. of 4 variables:
$ SNP: chr "rs1" "rs2" "rs3" "rs4" ...
$ CHR: int 1 1 1 1 1 1 1 1 1 1 ...
$ BP : int 1 2 3 4 5 6 7 8 9 10 ...
$ P : num 0.915 0.937 0.286 0.83 0.642 ...> head(gwasResults) SNP CHR BP P
1 rs1 1 1 0.9148060
2 rs2 1 2 0.9370754
3 rs3 1 3 0.2861395
4 rs4 1 4 0.8304476
5 rs5 1 5 0.6417455
6 rs6 1 6 0.5190959
> tail(gwasResults)
SNP CHR BP P
16465 rs16465 22 530 0.5643702
16466 rs16466 22 531 0.1382863 16467 rs16467 22 532 0.3936999 16468 rs16468 22 533 0.1778749 16469 rs16469 22 534 0.2393020 16470 rs16470 22 535 0.2630441
每一条染色体上的 SNPs 数量:
as.data.frame(table(gwasResults$CHR))
Var1 Freq
1 1 1500
2 2 1191
3 3 1040
4 4 945
5 5 877
6 6 825
7 7 784
8 8 750
9 9 721
10 10 696
11 11 674
12 12 655
13 13 638
14 14 622
15 15 608
16 16 595
17 17 583
18 18 572
19 19 562
20 20 553
21 21 544
22 22 535
绘制最基础曼哈顿图:
manhattan(gwasResults)
图形说明:
我们可以通过修改参数,更改图形的颜色、标题,以及去除横线:
manhattan(gwasResults,
main = "Manhattan Plot", ## 图形标题
ylim = c(0, 10), ## y 轴绘图范围
cex = 0.6, ## 减少点的大小到 60%
cex.axis = 0.9, ## 减少 X、Y 轴标签的字体大小到 90% col = c("blue4", "orange3"), ## 散点颜色;该函数会循环利用 col 中的颜色向量
suggestiveline = F, ## 去除 suggestive 参考线
genomewideline = F, ## 去除 genome-wide significance 参考线
chrlabs = c(1:20, "P", "Q")) ## 自定义染色体标号
查看单条染色体的分布情况:
anhattan(subset(gwasResults, CHR == 1))
对 chr3 染色体中感兴趣的 SNPs 进行高亮显示。qqman 包内置了一个叫 snpsOfInterest 向量(vector),该向量包含了 100 个位于 chr3 的 SNPs (snpsOfInterest <- paste0("rs", 3001:3100) )。
如果我们对不存在的 SNPs 进行高亮(highlight)显示,将会引发警告(warning:You're trying to highlight SNPs that don't exist in your results.)。
str(snpsOfInterest) chr [1:100] "rs3001" "rs3002" "rs3003" "rs3004" "rs3005" "rs3006" "rs3007" ... manhattan(gwasResults, highlight = snpsOfInterest)
我们也可以自定义感兴趣的 SNPs 进行高亮(highlight)显示,在 GWAS 中如何选择感兴趣的 SNPs:一般是我们做完 gwas 分析,哪个 peak 是你感兴趣的,我们就可以把该 peak 相关的 SNPs 单独提取出来。
hig = c("rs3057", "rs3056", 'rs3054', "rs4064", "rs11846", "rs13895")
manhattan(gwasResults, highlight = hig)以文件的形式读取感兴趣 SNPs
$ cat hig.txt
rs3057
rs3056
rs3054
rs4064
rs11846rs13895
hi = read.table("hig.txt")
manhattan(gwasResults, highlight = hi$V1)
综合高亮和区域限制,我们利用 xlim 参数对位于 chr3:200-500 区域 SNPs 中的 snpsOfInterest 进行高亮显示:
manhattan(subset(gwasResults, CHR == 3), highlight = snpsOfInterest, xlim = c(200, 500), main = "Chr 3")
我们可以利用 annotatePval 参数根据 p-value 值对 SNPs 进行注释。该参数默认会对位于每条染色体上,且大于其设定阈值的 Top SNP 进行注释(显示名称):
-log10(0.001) = 3
manhattan(gwasResults, annotatePval = 0.01)
我们也可以利用 annotatePval+annotateTop 对符合阈值范围内的所有 SNPs 进行注释:
-log10(0.005) ≈ 2.3manhattan(gwasResults, annotatePval = 0.005, annotateTop = FALSE)
关于 R 绘制 GWAS 研究的 Manhattan 图就介绍到这里,如果你觉得本文章对你有用,欢迎转发!
▍本文版权(图片及文字)属于“生信私房菜”(微信公众号:BioInit),禁止二次转载。部分图片来源于网络,如有侵权请联系删除。