Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ggplot2|玩转Manhattan图-你有被要求这么画吗?

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

作者头像
生信补给站
发布于 2020-08-06 03:23:26
发布于 2020-08-06 03:23:26
1.5K01
代码可运行
举报
文章被收录于专栏:生信补给站生信补给站
运行总次数:1
代码可运行

Manhattan图算是GWAS分析的标配图了,可参考Bio|manhattan图 进行绘制。

由于Manhattan点太多,后期AI/PS修改的话难度有点大,如果可以“个性化”绘制的话那是极好的!

一 载入R包,数据

1)载入数据处理的tidyverse包,使用qqman中gwasResults示例数据集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#载入R包
#install.packages("qqman")
library(qqman)
library(tidyverse)
#查看原始数据
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

我们知道Manhattan图实际就是点图,横坐标是chr,纵坐标是-log(Pvalue) ,原始P值越小,-log转化后的值越大,在图中就越高。

原始数据中重要的“元素”都有了 ,我们自己的数据也是只需要这四列就可以了。注意绘制前需要转化一下:

2)处理原始数据---计算SNP的累计位置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 1)计算chr长度
chr_len <- gwasResults %>% 
  group_by(CHR) %>% 
  summarise(chr_len=max(BP))
# 2) 计算每条chr的初始位置
chr_pos <- chr_len  %>% 
  mutate(total = cumsum(chr_len) - chr_len) %>%
  select(-chr_len)
#3)计算累计SNP的位置
Snp_pos <- chr_pos %>%
  left_join(gwasResults, ., by="CHR") %>%
  arrange(CHR, BP) %>%
  mutate( BPcum = BP + total)

#查看转化后的数据
head(Snp_pos,2)

  SNP CHR BP         P total BPcum
1 rs1   1  1 0.9148060     0     1
2 rs2   1  2 0.9370754     0     2

数据准备完成,开始绘图。

二 ggplot2绘制Manhattan图

1 纵坐标为P值转-log10()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggplot(Snp_pos, aes(x=BPcum, y=-log10(P))) +
    geom_point( aes(color=as.factor(CHR)))

基本图形出来了,但是有点怪;不急,一点点改进:

  • 横坐标标签设置在每个chr中间位置;
  • 背景色去掉,线去掉等
  • 去掉点和X轴之间的 “gap” (很多地方可用)
  • 添加阈值线
2 绘制加强版Manhattan图

1) 准备X轴标签位置--在每条chr的中间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X_axis <-  Snp_pos %>% group_by(CHR) %>% summarize(center=( max(BPcum) + min(BPcum) ) / 2 )

2)绘制“改良版”Manhattan图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p <- ggplot(Snp_pos, aes(x=BPcum, y=-log10(P))) +
#设置点的大小,透明度
    geom_point( aes(color=as.factor(CHR)), alpha=0.8, size=1.3) +
#设置颜色
    scale_color_manual(values = rep(c("grey", "skyblue"), 22 )) +
#设定Xscale_x_continuous( label = X_axis$CHR, breaks= X_axis$center ) +
#去除绘图区和X轴之间的gap
    scale_y_continuous(expand = c(0, 0) ) +  
#添加阈值线
    geom_hline(yintercept = c(6, -log10(0.05/nrow(Snp_pos))), color = c('green', 'red'), size = 1.2, linetype = c("dotted", "twodash")) + 
#设置主题
    theme_bw() +
    theme(
      legend.position="none",
      panel.border = element_blank(),
      axis.line.y = element_line(),
      panel.grid.major.x = element_blank(),
      panel.grid.minor.x = element_blank()
    )

这时候是不是就可以了,?。

当然了既然是ggplot2绘制的Manhattan图(点图),那么关于点,线,坐标,主题的设置当然都可以设置了,看这里

ggplot2|详解八大基本绘图要素

ggplot2|theme主题设置,详解绘图优化-“精雕细琢”

3 玩转Manhattan图
1) 利用数据集自带的snpsOfInterest标示显著的位点,展示重要的基因信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(ggrepel)
#准备数据
data <- Snp_pos %>%
# 添加高亮和注释信息:snpsOfInterest中的rs编号和P值大于6的点
  mutate( is_highlight=ifelse(SNP %in% snpsOfInterest, "yes", "no")) %>%
  mutate( is_annotate=ifelse(-log10(P)>6, "yes", "no"))

#绘图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p1 <- ggplot(data, aes(x=BPcum, y=-log10(P))) +
    geom_point( aes(color=as.factor(CHR)), alpha=0.8, size=1.3) +
    scale_color_manual(values = rep(c("grey", "skyblue"), 22 )) +
    scale_x_continuous( label = X_axis$CHR, breaks= X_axis$center ) +
    scale_y_continuous(expand = c(0, 0) ) +  
    # 添加高亮点
    geom_point(data=subset(data, is_highlight=="yes"), color="orange", size=2) +
    # 添加高亮label,且防止重叠
    geom_label_repel( data=subset(data, is_annotate=="yes"), aes(label=SNP), size=2) +
    theme_bw() + 
    theme(
      legend.position="none",
      panel.border = element_blank(),
      panel.grid.major.x = element_blank(),
      panel.grid.minor.x = element_blank()
    )

如果我们自己的gwas结果数据是Gene的话,label更改即可标示基因。

2) 自定义重要的基因,标示

如果有某些“目的基因”,想查看这些基因的P值呢?

新加gene和gene_annotate列即可!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#准备数据,使用基础函数
data <- Snp_pos
#根据目的基因的位置,新加gene和gene_annotate列
data$gene[data$CHR == 3 & data$BP == 366] <- "geneA"
data$gene_annotate[data$CHR == 3 & data$BP == 366] <- "yes"
data$gene[data$SNP == "rs4064"] <- "geneB"
data$gene_annotate[data$SNP == "rs4064"] <- "yes"
# 绘图
p2 <- ggplot(data, aes(x=BPcum, y=-log10(P))) +
    geom_point( aes(color=as.factor(CHR)), alpha=0.8, size=1.3) +
    scale_color_manual(values = rep(c("grey", "skyblue"), 22 )) +
    scale_x_continuous( label = X_axis$CHR, breaks= X_axis$center ) +
    scale_y_continuous(expand = c(0, 0) ) +  
    geom_label_repel( data=subset(data, gene_annotate=="yes"), aes(label=gene), size=4, col = "red") +
    theme_bw() + 
    theme(
      legend.position="none",
      panel.border = element_blank(),
      panel.grid.major.x = element_blank(),
      panel.grid.minor.x = element_blank()
    )
3)区域放大展示

重点展示某一区域的P值情况

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(ggforce)data <- Snp_pos %>%# 添加高亮和注释信息:snpsOfInterest中的rs编号和P值大于6的点
 mutate( is_highlight=ifelse(SNP %in% snpsOfInterest, "yes", "no")) %>%
 mutate( is_annotate=ifelse(-log10(P)>6, "yes", "no"))
  
  p3 <- ggplot(data, aes(x=BPcum, y=-log10(P))) +
   geom_point( aes(color=as.factor(CHR)), alpha=0.8, size=1.3) +
   scale_color_manual(values = rep(c("grey", "skyblue"), 22 )) +
   scale_x_continuous( label = X_axis$CHR, breaks= X_axis$center ) +
   scale_y_continuous(expand = c(0, 0) ) +   
   geom_point(data=subset(data, is_highlight=="yes"), color="orange", size=2) +facet_zoom(x = BPcum >= 3000 & BPcum <=3500)+
   theme_bw() + 
theme(
     legend.position="none",
     panel.border = element_blank(),
     panel.grid.major.x = element_blank(),
     panel.grid.minor.x = element_blank()
  )

可参考ggforce|绘制区域轮廓-区域放大-寻找你的“onepiece”

4)plotly 交互展示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(plotly)
  data <- Snp_pos %>%
  mutate( is_highlight=ifelse(SNP %in% snpsOfInterest, "yes", "no")) %>% filter(-log10(P)>0.5) #过滤一些点,交互式压力小
# 准备SNP展示的text信息
data$text <- paste("SNP: ", data$SNP, "\nPosition: ", data$BP, "\nChromosome: ", data$CHR, "\nLOD score:", -log10(data$P) %>% round(2), "\nWhat else do you wanna know", sep="")

p4 <- ggplot(data, aes(x=BPcum, y=-log10(P), text=text)) +
    geom_point( aes(color=as.factor(CHR)), alpha=0.8, size=1.3) +
    scale_color_manual(values = rep(c("grey", "skyblue"), 22 )) +
    scale_x_continuous( label = X_axis$CHR, breaks= X_axis$center ) +
    scale_y_continuous(expand = c(0, 0) ) +
    ylim(0,9) +
    geom_point(data=subset(data, is_highlight=="yes"), color="orange", size=2) +
    theme_bw() +
    theme(
      legend.position="none",
      panel.border = element_blank(),
      panel.grid.major.x = element_blank(),
      panel.grid.minor.x = element_blank()
    )
ggplotly(p4, tooltip="text")

好吧,其实这个用处不太大,,,

以上就是ggplot2绘制一些常见的Manhattan图,好处当然就是兼容ggplot2的参数,也就可以根据需要自行设置。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信补给站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
「R」数据可视化6 : 曼哈顿图
在生物信息领域我们常常使用R语言对数据可视化。在对数据可视化的时候,我们需要明确想要展示的信息,从而选择最为合适的图突出该信息。本系列文章将介绍多种基于不同R包的作图方法,希望能够帮助到各位读者。
王诗翔呀
2020/07/06
3.5K0
「R」数据可视化6 : 曼哈顿图
ggplot2优雅绘制曼哈顿图
计算Bonferroni校正后的显著性阈值。这是通过将0.05除以GWAS数据中的行数(即测试的总数)来实现的,用于调整多重比较的影响。
R语言数据分析指南
2024/01/10
3520
ggplot2优雅绘制曼哈顿图
ggplot2优雅的绘制森林图
❝本节来介绍如何使用ggplot2来绘制森林图,下面通过一个小例子来进行展示 ❞ 加载R包 library(tidyverse) 导入数据 unicox <- read_csv("AKT3_mRNA_OS_pancan_unicox.csv") 绘制森林图 p1 <- ggplot(unicox,aes(HR_log, cancer, col=Type))+ geom_point(aes(size=-log10(p.value)))+ geom_errorbarh(aes(xmax =u
R语言数据分析指南
2022/09/21
1.6K0
ggplot2优雅的绘制森林图
详谈如何使用ggplot2绘制火山图
小编已经搭建了一套稳定的真核转录组分析流程,可以完成「从原始数据分析到最终出结果分析文档」基本包含目前RNA_seq文章的所有分析内容。「有数据分析需求的朋友可联系小编进行咨询」
R语言数据分析指南
2023/08/18
1.2K0
详谈如何使用ggplot2绘制火山图
生信绘图与配色
3.散点- 几何对象: geom_point()函数,size,alpha为控制点属性的参数
用户11008504
2024/07/02
4290
R语言ggplot2绘制曼哈顿图展示GWAS分析的结果
之前分享过一篇推文介绍过这个内容 R语言ggplot2包画曼哈顿图的一个简单小例子,但是当时自己不太懂曼哈顿图,实现是直接借助ggplot2的geom_jitter()这个函数实现的。这个函数并不会考虑每个变异位点的位置,而实际的曼哈顿图是需要根据变异位点的位置来画的。今天的推文重新介绍一下ggplot2绘制曼哈顿图的代码。数据集就使用之前的推文中用到的数据跟着Nature Genetics学GWAS分析:emmax软件gwas分析/qqman包展示结果,这个数据太大,出图有些慢,只随机选取了其中1%的数据 (这个数据我自己的存储路径population.genomics/gwas/NG.tomato/at/)。
用户7010445
2023/09/21
1.2K0
R语言ggplot2绘制曼哈顿图展示GWAS分析的结果
ggplot2绘制嵌套圆图
❝本节来介绍如何使用「ggplot2」来绘制嵌套圆形图,图形绘制倒也简单主要是细节的调整结果仅供参考❞ 加载R包 library(tidyverse) 导入数据 bytes_total <- read_csv("bytes_total.txt") speed_index <- read_csv("speed_index.txt") 数据清洗 mobile_bytes <- bytes_total %>% filter(date %in% c("2022_10_01", "2018_10_01"),
R语言数据分析指南
2022/12/20
6570
ggplot2绘制嵌套圆图
跟着Nature Genetics 学画图:R语言ggplot2画基因结构示意图
今天试着重复的图片对应着的是论文附件中的Figure8c,基因结构图,论文中文字部分对图的描述是 Gene structure of Lsat_6X11620. Closed bars represent exons, and open bars represent untranslated regions and introns. The positions of the SNPs in the promoter region are indicated by black triangles. An highly associated SNP, A-to-G transition at Chr. 6:15,542,968 is represented by a red triangle.
用户7010445
2021/05/08
1.9K0
跟着Nature Genetics 学画图:R语言ggplot2画基因结构示意图
ggplot2绘制森林图(有亚组和没亚组)
之前写了很多篇推文介绍森林图,包括了常见的forestplot/forestploter/ggforestplot等多个R包:
医学和生信笔记
2023/02/14
2.8K0
ggplot2绘制森林图(有亚组和没亚组)
ggplot2(r包)绘制基因棒棒糖图
使用geom_segment添加棒棒图的棒子,geom_point添加棒棒图上面的圈圈,geom_text_repel添加对应的文字
生信技能树
2025/02/05
2560
ggplot2(r包)绘制基因棒棒糖图
文献组图
追风少年i
2025/01/07
1640
文献组图
R-ggplot2 基础图表绘制-散点图示例
前两期分别介绍了R-ggplot2 基础散点图R-ggplot2 基础图表绘制-散点图和 Python-seaborn基础散点图Python-seaborn 基础图表绘制-散点图 的绘制方法,较为系统的介绍了绘图的基础语法,也为一些绘图基础不是很好的小伙伴提供了参考方法,基础的讲过了,接下里我们将示例应用了啊(也是这个系列推文的流程啊:基础+示例演示),只为让你更好的掌握绘图知识点。本期的推文就使用R-ggplot2进行一个较为经典的图表仿制,也是自己一直想制作的图表。主要涉及的知识点如下:
DataCharm
2021/02/22
6880
R-ggplot2 基础图表绘制-散点图示例
R语言ggplot2做柱形图并在指定的位置添加灰色背景
ggplot2作图X轴默认坐标轴的刻度是朝下的,Y轴默认的刻度是朝左的,如果要改为朝上和朝右,该如何设置。之前也有人问过这个问题
用户7010445
2021/11/16
2.3K0
R语言ggplot2做柱形图并在指定的位置添加灰色背景
你还缺scRNA-seq的workflow吗?
之前曾老师给我看了一位在pipebio工作的生信工程师Roman Hillje的scRNA-seq的workflow,今天整理一下分享给大家。
生信菜鸟团
2024/07/31
5220
你还缺scRNA-seq的workflow吗?
ggplot2优雅的绘制轨道图
❝本节来绘制一个简单的绘图案例;暂且称之为轨道图;下面小编就通过一个详细的案例介绍如何绘制此图;关于此图的实践应用以后在做介绍 加载R包 library(tidyverse) library(systemfonts) library(colorspace) 导入数据 rent <- readr::read_csv('rent.txt') 定义调色板 colors <- wesanderson::wes_palettes$Zissou1 数据清洗 rent_sf_2012 <- rent %>%
R语言数据分析指南
2022/12/20
5630
ggplot2优雅的绘制轨道图
ggplot2优雅绘制时间序列热图
R语言数据分析指南
2024/01/10
4440
ggplot2优雅绘制时间序列热图
跟着Nature Ecology&Evolution学作图:R语言ggplot2世界地图/柱形图/组合图
https://www.nature.com/articles/s41559-023-02235-1
用户7010445
2023/11/30
1.4K0
跟着Nature Ecology&Evolution学作图:R语言ggplot2世界地图/柱形图/组合图
R语言ggplot2画棒棒糖图展示KEGG富集分析结果
https://www.nature.com/articles/s41588-024-01683-0
用户7010445
2024/04/15
4240
R语言ggplot2画棒棒糖图展示KEGG富集分析结果
ggplot2绘制半透明云雨图
R语言数据分析指南
2023/09/11
8190
ggplot2绘制半透明云雨图
跟着Nature Genetics学作图:R语言ggplot2曼哈顿图完整示例
https://www.nature.com/articles/s41588-022-01051-w
用户7010445
2023/01/06
1.2K0
跟着Nature Genetics学作图:R语言ggplot2曼哈顿图完整示例
相关推荐
「R」数据可视化6 : 曼哈顿图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档