qqman: an R package for creating Q-Q and manhattan plots from GWAS results
[This article was first published on Getting Genetics Done, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Three years ago I wrote a blog post on how to create manhattan plots in R. After hundreds of comments pointing out bugs and other issues, I’ve finally cleaned up this code and turned it into an R package.Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
The qqman R package is on CRAN: http://cran.r-project.org/web/packages/qqman/
The source code is on GitHub: https://github.com/stephenturner/qqman
If you’d like to cite the qqman package (appreciated but not required), please cite this pre-print: Turner, S.D. qqman: an R package for visualizing GWAS results using Q-Q and manhattan plots. biorXiv DOI: 10.1101/005165 (2014).
Something wrong? Please file bug reports, feature requests, or anything else related to the code as an issue on GitHub rather than commenting here. Also, please post the code you’re using and some example data causing a failure in a publicly accessible place, such as a GitHub gist (no registration required). It’s difficult to troubleshoot if I can’t see the data where the code is failing. Want to contribute? Awesome! Send me a pull request.
Note: This release is substantially simplified for the sake of maintainability and creating an R package. The old code that allows confidence intervals on the Q-Q plot and allows more flexible annotation and highlighting is still available at the version 0.0.0 release on GitHub.
Here’s a shout-out to all the blog commenters on the previous post for pointing out bugs and other issues, and a special thanks to Dan Capurso and Tim Knutsen for useful contributions and bugfixes.
qqman package tutorial
First things first. Install the package (do this only once), then load the package (every time you start a new R session)# only once: install.packages("qqman") # each time: library(qqman)You can access this help any time from within R by accessing the vignette:
vignette("qqman")The manhattan package includes functions for creating manhattan plots and q-q plots from GWAS results. The
gwasResults
data.frame included with the package has simulated results for 16,470 SNPs on 22 chromosomes. Take a look at the data: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.9148 2 rs2 1 2 0.9371 3 rs3 1 3 0.2861 4 rs4 1 4 0.8304 5 rs5 1 5 0.6417 6 rs6 1 6 0.5191 tail(gwasResults) SNP CHR BP P 16465 rs16465 22 530 0.5644 16466 rs16466 22 531 0.1383 16467 rs16467 22 532 0.3937 16468 rs16468 22 533 0.1779 16469 rs16469 22 534 0.2393 16470 rs16470 22 535 0.2630How many SNPs on each chromosome?
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
Creating manhattan plots
Now, let's make a basic manhattan plot.manhattan(gwasResults)
We can also pass in other graphical parameters. Let's add a title (
main=
), reduce the point size to 50%(cex=
), and reduce the font size of the axis labels to 80% (cex.axis=
):manhattan(gwasResults, main = "Manhattan Plot", cex = 0.5, cex.axis = 0.8)
Let's change the colors and increase the maximum y-axis:
manhattan(gwasResults, col = c("blue4", "orange3"), ymax = 12)
Let's remove the suggestive and genome-wide significance lines:
manhattan(gwasResults, suggestiveline = F, genomewideline = F)
Let's look at a single chromosome:
manhattan(subset(gwasResults, CHR == 1))
Let's highlight some SNPs of interest on chromosome 3. The 100 SNPs we're highlighting here are in a character vector called
snpsOfInterest
. You'll get a warning if you try to highlight SNPs that don't exist.str(snpsOfInterest) chr [1:100] "rs3001" "rs3002" "rs3003" "rs3004" "rs3005" ... manhattan(gwasResults, highlight = snpsOfInterest)
We can combine highlighting and limiting to a single chromosome:
manhattan(subset(gwasResults, CHR == 3), highlight = snpsOfInterest, main = "Chr 3")
A few notes on creating manhattan plots:
- Run
str(gwasResults)
. Notice that thegwasResults
data.frame has SNP, chromosome, position, and p-value columns namedSNP
,CHR
,BP
, andP
. If you're creating a manhattan plot and your column names are different, you'll have to pass the column names to thechr=
,bp=
,p=
, andsnp=
arguments. Seehelp(manhattan)
for details. - The chromosome column must be numeric. If you have “X,” “Y,” or “MT” chromosomes, you'll need to rename these 23, 24, 25, etc.
- If you'd like to change the color of the highlight or the suggestive/genomewide lines, you'll need to modify the source code. Search for
col="blue"
,col="red"
, orcol="green3"
to modify the suggestive line, genomewide line, and highlight colors, respectively.
Creating Q-Q plots
Creating Q-Q plots is straightforward - simply supply a vector of p-values to theqq()
function. You can optionally provide a title.qq(gwasResults$P, main = "Q-Q plot of GWAS p-values")
To leave a comment for the author, please follow the link and comment on their blog: Getting Genetics Done.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.