#' Clone tracking plot
#'
#' Creates line plot tracking amino acid frequencies across multiple samples
#'
#' @param sequence.matrix A sequence matrix generated from the LymphoSeq
#' function seqMatrix.
#' @param map An optional character vector of one or more sample names contained
#' in the productive.aa list. If the same sequence appears in multiple mapped
#' samples, then it will be assigned the label of the first listed sample only.
#' @param productive.aa A list of data frames of productive amino acid sequences
#' containing the samples to be mapped. This parameter is only required if
#' sequence mapping is performed.
#' @param label An optional character vector of one or more labels used to
#' annotate the mapped sequences. The order of the labels must match the order
#' of the samples listed in map.
#' @param track An optional character vector of one or more amino acid sequences
#' to track.
#' @param unassigned A Boolean value indicating whether or not to draw the lines
#' of sequences not being mapped or tracked. If TRUE then the unassigned
#' sequences are drawn. If FALSE, then the unassigned sequences are not drawn.
#' @return Returns a line plot showing the amino acid frequencies across
#' multiple samples in the sequence matrix where each line represents one
#' unique sequence.
#' @details The plot is made using the package ggplot2 and can be reformatted
#' using ggplot2 functions. See examples below.
#' @seealso An excellent resource for examples on how to reformat a ggplot can
#' be found in the R Graphics Cookbook online (\url{http://www.cookbook-r.com/Graphs/}).
#' @examples
#' file.path <- system.file("extdata", "TCRB_sequencing", package = "LymphoSeq")
#'
#' file.list <- readImmunoSeq(path = file.path)
#'
#' productive.aa <- productiveSeq(file.list = file.list, aggregate = "aminoAcid")
#'
#' top.freq <- topFreq(productive.aa = productive.aa, percent = 0.1)
#'
#' sequence.matrix <- seqMatrix(productive.aa = productive.aa, sequences = top.freq$aminoAcid)
#'
#' # Track clones without mapping or tracking specific sequences
#' cloneTrack(sequence.matrix = sequence.matrix)
#'
#' # Track top 20 clones mapping to the CD4 and CD8 samples
#' cloneTrack(sequence.matrix = sequence.matrix, productive.aa = productive.aa,
#' map = c("TRB_CD4_949", "TRB_CD8_949"), label = c("CD4", "CD8"),
#' track = top.freq$aminoAcid[1:20], unassigned = TRUE)
#'
#' # Track the top 10 clones from top.freq
#' cloneTrack(sequence.matrix = sequence.matrix, productive.aa = productive.aa,
#' track = top.freq$aminoAcid[1:10], unassigned = FALSE)
#'
#' # Track clones mapping to the CD4 and CD8 samples while ignoring all others
#' cloneTrack(sequence.matrix = sequence.matrix, productive.aa = productive.aa,
#' map = c("TRB_CD4_949", "TRB_CD8_949"), label = c("CD4", "CD8"),
#' unassigned = FALSE)
#'
#' # Track clones mapping to the CD4 and CD8 samples and track 2 specific sequences
#' cloneTrack(sequence.matrix = sequence.matrix, productive.aa = productive.aa,
#' map = c("TRB_CD4_949", "TRB_CD8_949"), label = c("CD4", "CD8"),
#' track = c("CASSPPTGERDTQYF", "CASSQDRTGQYGYTF"), unassigned = FALSE)
#'
#' # Reorder the x axis, change the axis labels, convert to log scale, and add title
#' x.limits <- c("TRB_Unsorted_0", "TRB_Unsorted_32",
#' "TRB_Unsorted_83", "TRB_Unsorted_949", "TRB_Unsorted_1320")
#'
#' sequence.matrix <- sequence.matrix[ ,c("aminoAcid", x.limits)]
#'
#' clone.track <- cloneTrack(sequence.matrix = sequence.matrix,
#' productive.aa = productive.aa, track = top.freq$aminoAcid[1:10], unassigned = FALSE)
#'
#' x.labels <- c("Day 0", "Day 32", "Day 83", "Day 949", "Day 1320")
#'
#' clone.track +
#' ggplot2::scale_x_discrete(expand = c(0,0), labels = x.labels) +
#' ggplot2::scale_y_log10() + ggplot2::annotation_logticks(sides = "l") +
#' ggplot2::ggtitle("Figure Title")
#' @export
#' @import ggplot2
#' @importFrom RColorBrewer brewer.pal
#' @importFrom reshape melt.data.frame
cloneTrack <- function(sequence.matrix, map = "none", productive.aa,
label = "none", track = "none", unassigned = TRUE) {
if (any(map != "none")) {
sequence.matrix$numberSamples <- NULL
sequence.melt <- reshape::melt.data.frame(sequence.matrix,
id.vars = "aminoAcid")
names(sequence.melt) <- c("aminoAcid", "Sample", "Frequency")
sequence.melt$Map <- rep("Unassigned", length(sequence.matrix$aminoAcid))
if (any(track != "none")) {
i <- 1
for (i in 1:length(track)) {
sequence.melt$Map <- ifelse(sequence.melt$aminoAcid == track[i],
track[i], sequence.melt$Map)
}
}
j <- 1
for (j in 1:length(map)) {
file <- productive.aa[[map[j]]]
aminoAcid <- as.character(file$aminoAcid)
sequence.melt$Map <- ifelse(sequence.melt$aminoAcid %in% aminoAcid &
sequence.melt$Map == "Unassigned",
label[j], sequence.melt$Map)
}
if (unassigned == FALSE) {
sequence.melt <- sequence.melt[sequence.melt$Map != "Unassigned", ]
}
getPalette <- grDevices::colorRampPalette(RColorBrewer::brewer.pal(9, "Set1"))
plot <- ggplot2::ggplot(sequence.melt,
aes_string(x = "Sample",
y = "Frequency",
group = "aminoAcid",
color = "Map")) +
geom_line() +
theme_minimal() +
scale_x_discrete(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0)) +
labs(x = "", y = "Frequency (%)", color = "") +
scale_colour_manual(values = c(getPalette(length(label) +
length(track) + 1))) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
return(plot)
} else {
sequence.matrix$numberSamples <- NULL
sequence.melt <- reshape::melt.data.frame(sequence.matrix, id.vars = "aminoAcid")
names(sequence.melt) <- c("aminoAcid", "Sample", "Frequency")
if (any(track != "none")) {
sequence.melt$Map <- rep("Unassigned", length(sequence.matrix$aminoAcid))
k <- 1
for (k in 1:length(track)) {
sequence.melt$Map <- ifelse(sequence.melt$aminoAcid == track[k],
track[k], sequence.melt$Map)
}
if (unassigned == FALSE) {
sequence.melt <- sequence.melt[sequence.melt$Map != "Unassigned",
]
}
getPalette <- grDevices::colorRampPalette(RColorBrewer::brewer.pal(9, "Set1"))
plot <- ggplot2::ggplot(sequence.melt, aes_string(x = "Sample",
y = "Frequency",
group = "aminoAcid",
color = "Map")) +
geom_line() + theme_minimal() +
scale_x_discrete(expand = c(0,0)) +
scale_y_continuous(expand = c(0, 0)) +
labs(x = "", y = "Frequency (%)", color = "") +
scale_colour_manual(values = getPalette(length(track) + 1)) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
return(plot)
}
plot <- ggplot2::ggplot(sequence.melt, aes_string(x = "Sample",
y = "Frequency",
group = "aminoAcid")) +
geom_line() +
theme_minimal() +
scale_x_discrete(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0)) +
labs(x = "", y = "Frequency (%)") +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
return(plot)
}
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.