##' @title Recall, precision, F1 per SV size
##' @param eval the output of \code{svevalOl}.
##' @param size.breaks a vector for breaking the sizes into classes.
##' @param plot should the function return the plot list. Default is TRUE. If FALSE,
##' returns a data.frame.
##' @return a list of ggplot objects if plot=TRUE (default); a data.frame otherwise.
##' @author Jean Monlong
##' @import ggplot2
##' @importFrom magrittr %>%
##' @importFrom rlang .data
##' @export
plot_persize <- function(eval, size.breaks=c(50,100,500,1e3,1e4,Inf), plot=TRUE){
svs = eval$svs
size.levels = levels(cut(size.breaks, breaks=size.breaks, include.lowest=TRUE))
## For each SV type
eval.df = lapply(names(svs), function(svtype){
svs = svs[[svtype]]
## For each class of variant
df = lapply(c('TP', 'TP.baseline', 'FP', 'FN'), function(metric){
svs = svs[[metric]]
if(length(svs) == 0) return(data.frame(type=svtype, metric=metric, size=size.levels,
n=0, stringsAsFactors=FALSE))
svs$size.class = cut(svs$size, breaks=size.breaks, include.lowest=TRUE)
## For each size class
df = lapply(size.levels, function(sl){
data.frame(type=svtype, metric=metric, size=sl,
n=sum(as.character(svs$size.class) == sl, na.rm=TRUE),
stringsAsFactors=FALSE)
})
do.call(rbind, df)
})
do.call(rbind, df)
})
eval.df = do.call(rbind, eval.df)
## Reformat into one row per size class/type with columns TP, FP, etc
eval.df = tidyr::spread(eval.df, 'metric', 'n', fill=0)
## Precision, recall and F1
eval.df = prf(eval.df)
if(plot){
ggp.l = list()
recall = precision = F1 = type = size = NULL
ggp.l$f1 = ggplot(eval.df, aes(x=size, y=F1, color=type)) +
geom_line() + geom_point() + theme_bw()
ggp.l$precision = ggplot(eval.df, aes(x=size, y=precision, color=type)) +
geom_line() + geom_point() + theme_bw()
ggp.l$recall = ggplot(eval.df, aes(x=size, y=recall, color=type)) +
geom_line() + geom_point() + theme_bw()
return(ggp.l)
} else {
return(eval.df)
}
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.