曼哈頓圖(Manhattan plot)是一種GWAS分析中常用的展示基因組數據的散點圖。可以R語言中的qqman、CMplot及ggplot2三個包繪制曼哈頓圖。
基于qqman包繪制
1、安裝、加載R包
安裝包
#install.package("qqman")
#加載包
library(qqman)
2、數據
#加載數據——以qqman包自帶示例數據gwasresult數據為例
df1 <- gwasResults #數據中SNP為SNP名稱,CHR為染色體編號,BP為堿基位置,P為p值
head(df1) #預覽數據
image.png
3、繪圖
manhattan(df1, #繪圖數據
col = c('#30A9DE','#EFDC05','#E53A40','#090707'), #交替使用顏色展示
suggestiveline = -log10(1e-05), #-log10(1e-5)處添加"suggestive"橫線
genomewideline = -log10(5e-10), #-log10(5e-10)處添加"genome-wide sigificant"橫線
highlight = snpsOfInterest, #內置高亮的snp數據, 也可以對snpOfInterest進行設置
annotatePval = 0.05, #標記p值小于0.05的點
annotateTop = T, #如果為T,則僅批注低于注解閾值的每個染色體上的頂部點,為F則標記所有小于注解閾值的點。
main = "XXXXXXXX" #標題
)
image.png
基于CMplot包繪制
1、安裝、加載包
#安裝包
#install.package("CMplot")
#加載包
library(CMplot)
2、數據
#加載數據——以CMplot包自帶示例數據pig60k數據為例
data(pig60K) #預覽數據
image.png
3、繪圖
#在工作目錄下會生成一系列圖
CMplot(pig60K, #示例數據
chr.den.col=c("black","green","red"), #SNP密度展示
file="jpg", #繪制圖片類型
memo="", #輸出文件名中添加一個字符
dpi = 600) #繪制圖片的分辨率
CMplot(Pmap,
col=c("#4197d8", "#f8c120", "#413496", "#495226",
"#d60b6f", "#e66519", "#d581b7", "#83d3ad", "#7c162c", "#26755d"),
bin.size=1e6, bin.range=NULL, bin.legend.num=10, pch=19, type="p",
band=1, H=1.5, ylim=NULL, cex.axis=1, lwd.axis=1.5, cex.lab=1.5,
plot.type="b", multracks=FALSE, points.alpha=100L, cex=c(0.5,1,1),
r=0.3, outward=FALSE, ylab=expression(-log[10](italic(p))),
ylab.pos=3, xticks.pos=1, mar = c(3,6,3,3), threshold = NULL,
threshold.col="red", threshold.lwd=1, threshold.lty=2,
amplify= TRUE, signal.cex = 1.5, signal.pch = 19,
signal.col=NULL, signal.line=2, highlight=NULL, highlight.cex=1,
highlight.pch=19, highlight.type="p", highlight.col="red",
highlight.text=NULL, highlight.text.col="black", highlight.text.cex=1,
highlight.text.xadj=NULL, highlight.text.yadj=NULL,
highlight.text.font=3, chr.labels=NULL, chr.border=FALSE,
chr.labels.angle=0, chr.den.col="black", chr.pos.max=FALSE, cir.band=1,
cir.chr=TRUE, cir.chr.h=1.5, cir.legend=TRUE, cir.legend.cex=0.6,
cir.legend.col="black", LOG10=TRUE, box=FALSE, conf.int=TRUE,
conf.int.col=NULL, file.output=TRUE, file=c("jpg","pdf","tiff"),
dpi=300, height=NULL, width=NULL, memo="", main="", main.cex=1.5,
main.font=2, trait.legend.ncol=NULL, verbose=TRUE)
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
基于ggplot2包進行繪制
1、安裝、加載包
#安裝包
# install.packages("ggplot2")
# install.packages("tidyverse")
# install.packages("ggforce")
# install.packages("ggprism")
#加載包
library(ggplot2)
library(tidyverse)
library(ggforce)
library(ggprism)
2、數據及其處理
#數據,同樣以qqman包自帶數據gwasresult為例
df <- gwasResults
###數據處理
df %>%
group_by(CHR) %>%
summarise(df_chr_len=max(BP)) %>% #計算染色體長度
mutate(total = cumsum(df_chr_len) - df_chr_len) %>%
select(-df_chr_len) %>% #計算染色體初始位置
left_join(df, ., by="CHR") %>%
arrange(CHR, BP) %>%
mutate( BPcum = BP + total)->df_SNP_position #計算累計SNP的位置
head(df_SNP_position) #預覽數據
image.png
3、繪圖
#X軸標簽位置
X_axis <- df_SNP_position %>% group_by(CHR) %>% summarize(center=( max(BPcum) +min(BPcum) ) / 2 )
#添加高亮和注釋信息:snpsOfInterest中的rs編號和P值大于10的點
data <- df_SNP_position %>%
mutate( is_highlight=ifelse(SNP %in% snpsOfInterest, "yes", "no")) %>%
mutate( is_annotate=ifelse(-log10(P)>10, "yes", "no"))
#繪圖
ggplot(data, aes(x=BPcum, y=-log10(P))) +
geom_point(aes(color=as.factor(CHR)),alpha=0.8, size=1.5)+
scale_color_manual(values = rep(c('#30A9DE','#EFDC05','#E53A40','#090707'), 22 ))+#顏色設置
scale_x_continuous(label = X_axis$CHR, breaks= X_axis$center)+#設定X軸
scale_y_continuous(expand = c(0, 0) ) +#去除繪圖區和X軸之間的gap
geom_hline(yintercept = c(6, -log10(0.05/nrow(df_SNP_position))), #添加閾值線
color = c('green', 'red'),size = 1.2,
linetype = c("dotted", "twodash")) +
geom_point(data=subset(data, is_highlight=="yes"), color="green",
size=2)+facet_zoom(x = BPcum >= 3000 & BPcum <=3500)+#展示某一區域的p值情況
theme_prism(palette = "flames",#使用ggprism包自帶主題
base_fontface = "plain",
base_family = "serif",
base_size = 16,
base_line_size = 0.8,
axis_text_angle = 45)+
theme(legend.position = "none",#去除圖例
panel.grid = element_blank(),
panel.border = element_blank(),
axis.line.x = element_line(),
axis.line.y = element_line())
image.png
參考: