R/qtlcharts is an R package to create interactive charts for QTL data, for use with R/qtl. While its interactive QTL charts are particularly useful for exploratory data analysis within R, they may also be included within R Markdown-based reports.
R Markdown is a extension of Markdown, using knitr, to write simply-marked-up text, with chunks of R code, that is converted to an html file, for viewing in a web browser. The chunks of code are processed by knitr and replaced with the results or graphs produced.
For more information on R Markdown and knitr, see the knitr in a knutshell tutorial.
To include R/qtlcharts-based interactive charts within an R Markdown document, you just need to include the relevant calls to the R function within a code chunk.
I’m going to use defaults of fig.width=8
and fig.height=6
for each of these charts. (But note that iplotRF
and iplotScantwo
ignore these settings.)
knitr::opts_chunk$set(fig.width=8, fig.height=6, message=FALSE)
As an example, we’ll consider the grav
dataset included with R/qtlcharts. These are data from Moore et al. Genetics 195:1077-1086, 2013, on a QTL experiment on gravitropism in Arabidopsis, with data on 162 recombinant inbred lines (Ler × Cvi). Seedlings were sprouted and then rotated 90 degrees with respect to gravity; the growth of the seedlings was then recorded on video. The outcome is the root tip angle (in degrees) at two-minute increments over eight hours.
We’ll first load the R/qtl and R/qtlcharts packages and the data set.
library(qtl)
library(qtlcharts)
data(grav)
For this illustration, we’ll reduce the size of the data set, by retaining only every 5th phenotype value.
grav$pheno <- grav$pheno[,seq(1, nphe(grav), by=5)]
The times at which the measurements were made are recorded (in minutes) in the phenotype names. We’ll grab those times and convert them to hours.
times <- as.numeric(sub("T", "", phenames(grav)))/60
Let’s further run a single-QTL genome scan with each individual time point, using Haley-Knott regression.
grav <- calc.genoprob(grav, step=1)
out.hk <- scanone(grav, pheno.col=1:nphe(grav), method="hk")
First, let’s make an interactive chart of the genetic map of markers for these data, just because it’s easy. iplotMap
will take either a map object or the cross object grav
; in the latter case, it uses the R/qtl function pull.map
to pull out the map.
iplotMap(grav)
Now, let’s use iplotCorr
to plot a heat map of the correlation matrix for the phenotype at all pairs of times, linked to scatterplots of the phenotypes. (Note that for this plot, I’m using fig.height=4.2
in order to avoid some empty space below the figure.)
iplotCorr(grav$pheno)
Next, let’s use plotCurves
to create an interactive plot of the phenotype traces, linked to scatterplots of two cross-sections. We use chartOpts
to specify the axis labels.
iplotCurves(grav$pheno, times,
grav$pheno[,c("T30", "T240")],
grav$pheno[,c("T240", "T480")],
chartOpts=list(curves_xlab="Time", curves_ylab="Root tip angle",
scat1_xlab="Angle at 30 min", scat1_ylab="Angle at 4 hrs",
scat2_xlab="Angle at 4 hrs", scat2_ylab="Angle at 8 hrs"))
Finally, iplotMScanone
produces a heat map of the LOD scores for each individual time point at each genomic position, linked to the individual LOD curves and to a plot of the estimated QTL effect over time.
iplotMScanone(out.hk, grav, chartOpts=list(eff_ylab="QTL effect"))
If you want to produce multiple interactive charts within a loop, you need to finesse it a bit with tags
and tagList
from the htmltools package.
Create a list containing the charts, wrap each within a <p>
tag using tags$p()
, and then use tagList
when you print the list.
times <- c("T30", "T240", "T480")
times_number <- match(times, phenames(grav))
plot_list <- vector("list", length(times))
for(i in seq(along=times))
plot_list[[i]] <- iplotScanone(out.hk, lodcolumn=times_number[i])
plot_list <- lapply(plot_list, htmltools::tags$p)
htmltools::tagList(plot_list)