Page last updated: 04 May, 2019
Examples
For these plots we will use the GWAS data.
gg.qqplot()
##### Packages
library(ggplot2)
##### Plotting variables
point_colour <- discrete_wes_pal[1]
point_size <- 2
point_transparency <- 0.8
##### Plot
gg.qqplot <- function(ps, ci = 0.95) {
n <- length(ps)
df <- data.frame(
observed = -log10(sort(ps)),
expected = -log10(ppoints(n)),
clower = -log10(qbeta(p = (1 - ci) / 2, shape1 = 1:n, shape2 = n:1)),
cupper = -log10(qbeta(p = (1 + ci) / 2, shape1 = 1:n, shape2 = n:1))
)
log10Pe <- expression(paste("Expected -log"[10], plain(P)))
log10Po <- expression(paste("Observed -log"[10], plain(P)))
ggplot(df) +
geom_point(aes(expected, observed), alpha = point_transparency, size = point_size, colour = point_colour) +
geom_abline(intercept = 0, slope = 1, alpha = 0.5) +
geom_line(aes(expected, cupper), linetype = 2) +
geom_line(aes(expected, clower), linetype = 2) +
xlab(log10Pe) +
ylab(log10Po) +
# Customise the theme:
my_theme() +
theme(
axis.text.x = element_text(hjust = 0.5,
vjust = 1),
axis.text.y = element_text(hjust = 1,
vjust = 0.5)
)
}
gg.qqplot(gwas_data$P,
ci = NA) #remove confidence intervals with 'NA'

LS0tCnRpdGxlOiAiUVEgcGxvdCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IGZhbHNlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICBkZl9wcmludDogcGFnZWQKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGhpZ2hsaWdodGVyOiBudWxsCi0tLQoKYGBge3Igc2V0dXAsIGV2YWw9VFJVRSwgaW5jbHVkZT1GQUxTRSwgZWNobz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPVRSVUUsIGZpZy5hbGlnbj0nY2VudGVyJywgY29tbWVudD0iIn0KY2hvb3NlQ1JBTm1pcnJvcihncmFwaGljcz1GQUxTRSwgaW5kPTEzMykKc291cmNlKCJzb3VyY2UvcGxvdHMtb3ZlcnZpZXcuUiIpCmBgYApfX18KClBhZ2UgbGFzdCB1cGRhdGVkOiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYAoKXCAgCgojIEV4YW1wbGVzIHsjcXFwbG90IC50YWJzZXR9CgpGb3IgdGhlc2UgcGxvdHMgd2Ugd2lsbCB1c2UgdGhlIFtHV0FTIGRhdGFdKCNnd2FzX2RhdGEpLgoKYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFLCBmaWcuYWxpZ249J2NlbnRlcicsIGNvbW1lbnQ9IiJ9CmhlYWQoZ3dhc19kYXRhKQpgYGAKClwgIAoKIyMgZ2cucXFwbG90KCkgCgpgYGB7ciBxcV9wbG90LCBldmFsPVRSVUUsIGluY2x1ZGU9VFJVRSwgZWNobz1UUlVFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY2FjaGU9VFJVRSwgZmlnLmFsaWduPSdjZW50ZXInLCBjb21tZW50PSIifQojIyMjIyBQYWNrYWdlcwpsaWJyYXJ5KGdncGxvdDIpCgojIyMjIyBQbG90dGluZyB2YXJpYWJsZXMKcG9pbnRfY29sb3VyIDwtIGRpc2NyZXRlX3dlc19wYWxbMV0KcG9pbnRfc2l6ZSA8LSAyCnBvaW50X3RyYW5zcGFyZW5jeSA8LSAwLjgKCiMjIyMjIFBsb3QKZ2cucXFwbG90IDwtIGZ1bmN0aW9uKHBzLCBjaSA9IDAuOTUpIHsKICBuICA8LSBsZW5ndGgocHMpCiAgZGYgPC0gZGF0YS5mcmFtZSgKICAgIG9ic2VydmVkID0gLWxvZzEwKHNvcnQocHMpKSwKICAgIGV4cGVjdGVkID0gLWxvZzEwKHBwb2ludHMobikpLAogICAgY2xvd2VyICAgPSAtbG9nMTAocWJldGEocCA9ICgxIC0gY2kpIC8gMiwgc2hhcGUxID0gMTpuLCBzaGFwZTIgPSBuOjEpKSwKICAgIGN1cHBlciAgID0gLWxvZzEwKHFiZXRhKHAgPSAoMSArIGNpKSAvIDIsIHNoYXBlMSA9IDE6biwgc2hhcGUyID0gbjoxKSkKICApCiAgbG9nMTBQZSA8LSBleHByZXNzaW9uKHBhc3RlKCJFeHBlY3RlZCAtbG9nIlsxMF0sIHBsYWluKFApKSkKICBsb2cxMFBvIDwtIGV4cHJlc3Npb24ocGFzdGUoIk9ic2VydmVkIC1sb2ciWzEwXSwgcGxhaW4oUCkpKQogIGdncGxvdChkZikgKwogICAgZ2VvbV9wb2ludChhZXMoZXhwZWN0ZWQsIG9ic2VydmVkKSwgYWxwaGEgPSBwb2ludF90cmFuc3BhcmVuY3ksIHNpemUgPSBwb2ludF9zaXplLCBjb2xvdXIgPSBwb2ludF9jb2xvdXIpICsKICAgIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgYWxwaGEgPSAwLjUpICsKICAgIGdlb21fbGluZShhZXMoZXhwZWN0ZWQsIGN1cHBlciksIGxpbmV0eXBlID0gMikgKwogICAgZ2VvbV9saW5lKGFlcyhleHBlY3RlZCwgY2xvd2VyKSwgbGluZXR5cGUgPSAyKSArCiAgICB4bGFiKGxvZzEwUGUpICsKICAgIHlsYWIobG9nMTBQbykgKwogIAogICMgQ3VzdG9taXNlIHRoZSB0aGVtZToKICAgIG15X3RoZW1lKCkgKwogICAgdGhlbWUoCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMSksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkKICAgICkKfQoKZ2cucXFwbG90KGd3YXNfZGF0YSRQLAogICAgICAgICAgY2kgPSBOQSkgI3JlbW92ZSBjb25maWRlbmNlIGludGVydmFscyB3aXRoICdOQScKYGBgCgoK