曼哈顿图本质上是一个散点图,用于显示大量非零大范围波动数值,最早应用于全基因组关联分析(GWAS)研究展示高度相关位点。它得名源于样式与曼哈顿天际线相似(如下图)。

近几年,在宏基因组领域,尤其是差异OTU结合分类学结果,采用 Manhattan plot 展示有非常好的效果,倍受推崇。


曼哈顿图优点

大数据中,即展示数据全貌,又能快速找到目标基因或 OTU,同时可知目标的具体位置和分类、显著程度等信息。绝对高端大气,而且还有内涵。


曼哈顿图解读

数据坐标轴介绍,以下图 GWAS 研究结果为例:

  • X 轴为染色体编号,且每个基因组 SNP 位点沿染色体序列排列;在 16S 扩增子或宏基因组中则为 OTU 按 Taxonomy 某一级别排序。

  • Y 轴为该位点相关的统计显著性 Pvalue 值,由于 pvalue 值范围是从 0-1,且越小越好,直接展示非常密集于 0 附近,很难区分。如何使越近 0 的显著数值变大,且而容易区分开,log10 变换是非常好的方法,直接把关注的高显著性(Pvalue 趋近零)值高位显示,远离整体,目标一目了然。

  • 图中水平线一般为设定的不同显著性水平阈值,方便读出每个点的显著性水平;或只添加一条显示性阈值,高于则显著。


曼哈顿图绘制工具

R 语言(ggplot2,qqman)、Python(geneview)都能绘制曼哈顿图。本文主要介绍如何使用 R 语言中的 qqman 包绘制 GWAS 研究的 Manhattan 图。


R语言 qqman 包

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.

1. 安装


在 R 中安装 qqman :

# install only once
install.packages("qqman")

# load every time you use it
library(qqman)

【左右滑动查看完整信息】

2. 数据


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

【左右滑动查看完整信息】

3. 绘制曼哈顿图

绘制最基础曼哈顿图:

manhattan(gwasResults)

【左右滑动查看完整信息】

图形说明:

  • 各染色体散点数据来自 gwasResult,是绘图的主数据;

  • chr3 的线状点来自 qqman 内置的 snpsOfInterest 向量(snpsOfInterest <- paste0("rs", 3001:3100)),由 highlight 参数控制;

  • 灰色横线(suggestive)由参数 suggestiveline 控制,默认 -log10(1e-5) = 5 ;如果为 FALSE,不绘制;

  • 红色横线(genome-wide significance)由参数 genomewideline 控制,默认 -log10(5e-8) ≈ 7.3;如果为 FALSE,不绘制;

  • 灰色、红色横线也可以使用 aline 函数进行绘制:

    abline(h=-log10(5e-8), col="red", lty=1, lwd=1) 
    abline(h=-log10(1e-5), col="blue", lty=1, lwd=1)

我们可以通过修改参数,更改图形的颜色、标题,以及去除横线:

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")) ## 自定义染色体标号

【左右滑动查看完整信息】

查看单条染色体的分布情况:

manhattan(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
rs11846
rs13895

> 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.3
manhattan(gwasResults, annotatePval = 0.005, annotateTop = FALSE)

【左右滑动查看完整信息】

4. 注意事项

  • 通过执行 str(gwasResults),可以看到 gwasResults 数据框包含了 SNP、染色体、位置,以及 p-value 4 列信息,并分别对应命名为 SNP, CHR, BP,以及 P。如果我们使用 qqman 绘制曼哈顿图但输入数据的列名不一样时,需要使用 chr="输入数据染色体列名", bp="输入数据位置列名",p="输入数据 p-value 列名",以及 snp="输入数据 snp 列名" 进行重新设置。

  • 输入数据的染色体(chromosome)列必须为数值(numeric)。如果名字包含 "X", "Y", 或者 "MT",我们必须把它们重命名为 23, 24, 25 等。我们也可以通过修改源码(e.g., fix(manhattan))的方式更改指定轴刻度标签(labs <- unique(d$CHR))为我们想要的任何形式。

  • 如果想要更改高亮(highlight)或者 suggestive/genomewide 线的颜色,我们需要在源码中找到 col="blue"(suggestive line), col="red"(genomewide line), 以及 col="green3"(highlight colors)后分别进行修改。suggestive/genomewide 线的颜色与样式,也可以使用 aline 函数进行修改(参上上文的"图形说明")。

关于 R 绘制 GWAS 研究的 Manhattan 图就介绍到这里,如果你觉得本文章对你有用,欢迎转发!

本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

R 绘制 GWAS 研究的 Manhattan 图的更多相关文章

  1. ggplot2|玩转Manhattan图-你有被要求这么画吗?

    本文首发于“生信补给站”,ggplot2|玩转Manhattan图-你有被要求这么画吗?更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号. Manhattan图算是GWAS分析的标配图 ...

  2. R绘制中国地图,并展示流行病学数据

    流行病学的数据讲究“三间分布”,即人群分布.时间分布和空间分布.其中的“空间分布”最好是在地图上展示,才比较清楚.R软件集统计分析与高级绘图于大成,是最适合做这项工作了.关于地图的绘制过程,谢益辉.邱 ...

  3. 绘制3D的托卡马克位形图的matlab脚本文件 ThreeD.m

    % 绘制3D的托卡马克位形图, (V 0.1 by Jiale Chan for Y. H. Huang) % Dee Formula % 特征参数     rzero = 2.0;     rmax ...

  4. GWAS研究中case和control的比例是有讲究的?

    GWAS研究中,表型分两种.第一种是线性的表型,如果身高.体重.智力等:第二种是二元的表型,比如患病和未患病,即通常所说的case和control.对于表型是线性的样本来说,是不存在case和cont ...

  5. 用R包中heatmap画热图

    一:导入R包及需要画热图的数据 library(pheatmap) data<- read.table("F:/R练习/R测试数据/heatmapdata.txt",head ...

  6. 用HTML5绘制的一个星空特效图

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 用Python 绘制分布(折线)图

    用Python 绘制分布(折线)图,使用的是 plot()函数. 一个简单的例子: # encoding=utf-8 import matplotlib.pyplot as plt from pyla ...

  8. Unity绘制圆和缓动雷达图

    Unity绘制圆和缓动雷达图 之前在做UI模块的时候遇到过需要做雷达图的效果,所以简单复习了一下 关于网格绘制 我们都知道Unity绘制图形是通过Mesh网格添加顶点进行绘制,那么知道顶点信息后如何实 ...

  9. C#绘制立体三维饼状图

    转载自原文 C#绘制立体三维饼状图(超酷) 内容原文地址:LINK [翻译]Julijan Sribar著3D Pie Chart一个用于绘制立体三维饼状图的C#类库[简介]本文的想法就是创建一个独立 ...

  10. 使用highcharts绘制美观的燃尽图

    使用highcharts绘制美观的燃尽图 助教在博客中介绍了两种绘制燃尽图的方法,但是我们组在使用时发现有些任务不适合写进issue,而且网站生成的燃尽图不是很美观,因此我们打算使用其他方法自己绘制燃 ...

随机推荐

  1. 如何理解redis两种不同的持久化方式

    其实redis就是一种高级的以键值对形式存储数据的数据库,而它的好处就是他可以支持数据的持久化,其实redis之所以会有这样的优点,主要是因为,redis的数据都是存放在内存中的,如果不配置持久化,那 ...

  2. urllib.request发送get请求

    发送请求 urllib.request库 模拟浏览器发起一个HTTP请求,并获取请求响应结果 urllib.request.urlopen的语法格式 urllib(url.data = None,[t ...

  3. 记录hive一次数据倾斜问题的解决以及思考总结

    解决数据倾斜是大数据开发中比较重要的能力,这个现象指的是分布式集群中,由于数据分发的不当,导致某个节点要处理的错误过多,导致整个计算机任务迟迟结束不了,甚至可能节点出现OOM使得任务失败 处理数据倾斜 ...

  4. monggodb项目操作

    1.回顾 1.express + node 1.1 准备工作 前后端不分离开发 --- 前端负责写页面,后端负责渲染 --- admin-lte 1.2 创建express项目 express mya ...

  5. 纯CSS3实现多行文本截断

    纯CSS处理多行文本展开和收起,直接上代码和效果图 1 <html> 2 <header> 3 <style> 4 .wrap { 5 position: rela ...

  6. 1、kubernetes概念

    一.kubernetes简介 kubernetes的本质是一组服务器集群.它可以在每个节点上运行特定的程序,来对节点中的容器进行管理.目的是为了实现资源管理的自动化. 主要功能如下: 1.自我修复:一 ...

  7. kubernetes(k8s)安装BGP模式calico网络支持IPV4和IPV6

    kubernetes(k8s)安装BGP模式calico网络支持IPV4和IPV6 BGP是互联网上一个核心的去中心化自治路由协议,它通过维护IP路由表或"前缀"表来实现自治系统A ...

  8. 四月二十二日java基础知识

    1.利用接口实现类的多重继承:java语言中接口的主要作用是可以帮助实现类似于类的多重继承功能.多重继承,是指一个子类可以有一个以上的直接父类,该子类可以直接继承它所有父类的非私有成员.2.一个类实现 ...

  9. 全网最详细中英文ChatGPT-GPT-4示例文档-食谱智能生成从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...

  10. Java:如何加密或解密PDF文档?

    在工作中,我们会将重要的文档进行加密,并且设置用户的访问权限,其他外部人员均无法打开,只有获取该权限的用户才有资格打开文档.此外,限制用户的使用权限,极大程度上阻止了那些有意要篡改.拷贝其中内容的人, ...