Mercurial > repos > marie-tremblay-metatoul > nmr_preprocessing
view DrawFunctions.R @ 6:6e837e9352a2 draft default tip
"planemo upload for repository https://github.com/workflow4metabolomics/nmr_preprocessing commit 62fed9acaee7410de763b756cfa7de48ee258929"
author | workflow4metabolomics |
---|---|
date | Wed, 13 May 2020 03:52:09 -0400 |
parents | 5e64657b4fe5 |
children |
line wrap: on
line source
require(ggplot2) require(gridExtra) require(reshape2) Draw <- function(Signal_data, type.draw = c("signal", "pca"), output = c("default", "window", "png", "pdf"), dirpath = ".", filename = "%003d", height = 480, width = 640, pdf.onefile = TRUE, ...) { # Data initialisation and checks ---------------------------------------------- type.draw <- match.arg(type.draw) output <- match.arg(output) fullpath <- paste(file.path(dirpath, filename), output, sep = ".") createFile <- TRUE createWindow <- FALSE # Drawing -------------------------------------------------------------------- # output switch(output, default = { createFile <- FALSE }, window = { createWindow <- TRUE createFile <- FALSE }, png = { grDevices::png(fullpath, width, height) }, pdf = { grDevices::pdf(fullpath, width = width/72, height = height/72, onefile = pdf.onefile) }, { stop("Unknown output type.") }) # Drawing type (signal/spectrum or PCA) funs <- list(signal = DrawSignal, pca = DrawPCA) if (type.draw %in% names(funs)) { fun <- funs[[type.draw]] } else { stop(paste("Unknown type:", type.draw)) } # Plot finalisation ---------------------------------------------- if (is.vector(Signal_data)) { Signal_data <- vec2mat(Signal_data) } fun(Signal_data, createWindow = createWindow, ...) if (createFile) { grDevices::dev.off() } } ##### DrawSignal DrawSignal <- function(Signal_data, subtype = c("stacked", "together", "separate", "diffmean", "diffmedian", "diffwith"), ReImModArg = c(TRUE, FALSE, FALSE, FALSE), vertical = T, xlab = "rowname", RowNames = NULL, row = 1, num.stacked = 4, main = NULL, createWindow) { # nticks # Data initialisation and checks ---------------------------------------------- subtype <- match.arg(subtype) vec <- is.vector(Signal_data) if (vec) { Signal_data <- vec2mat(Signal_data) } n <- nrow(Signal_data) m <- ncol(Signal_data) if (n < num.stacked){ num.stacked <- n } scale <- colnames(Signal_data) num.plot <- sum(ReImModArg) Var <- rowname <- value <- NULL # only for R CMD check # Drawing array if (num.plot <= 0) { stop("Nothing selected in ReImModArg.") } else if (num.plot <= 2) { if (vertical) { nrow <- num.plot ncol <- 1 } else { nrow <- 1 ncol <- num.plot } } else { nrow <- 2 ncol <- 2 } # RowNames if (is.null(RowNames)) { RowNames <- rownames(Signal_data) if (is.null(RowNames)) { RowNames <- 1:n } } else { if (!is.vector(RowNames)) { stop("RowNames is not a vector") } if (length(RowNames) != n) { stop(paste("RowNames has length", length(RowNames), "and there are", n, "FIDs.")) } } if (n == 1) { RowNames <- deparse(substitute(Signal_data)) } elements <- list() if (ReImModArg[1]) { elements[["Re"]] <- Re(Signal_data) rownames(elements[["Re"]]) <- RowNames } if (ReImModArg[2]) { elements[["Im"]] <- Im(Signal_data) rownames(elements[["Im"]]) <- RowNames } if (ReImModArg[3]) { elements[["Mod"]] <- Mod(Signal_data) rownames(elements[["Mod"]]) <- RowNames } if (ReImModArg[4]) { elements[["Arg"]] <- Arg(Signal_data) rownames(elements[["Arg"]]) <- RowNames } # Drawing -------------------------------------------------------------------- y = x = NULL # only for R CMD check # SEPARATE or STACKED =============== if (subtype == "separate" | subtype == "stacked") { i <- 1 while (i <= n) { if (createWindow) { grDevices::dev.new(noRStudioGD = TRUE) } if (subtype == "separate") { # The other uses gridExtra to do that graphics::par(mfrow = c(nrow, ncol)) } plots <- list() if (subtype == "separate") { last <- i } else { last <- min(i + num.stacked - 1, n) } for (name in names(elements)) { if (subtype == "separate") { if (n == 1) { df <- data.frame(x = as.numeric(scale), y = elements[[name]]) } else {df <- data.frame(x = as.numeric(scale), y = elements[[name]][i, ]) } plots[[name]] <- ggplot2::ggplot(data = df, ggplot2::aes(x = x, y = y)) + ggplot2::geom_line(size = 1) + ggplot2::theme(legend.position = "none") + ggplot2::labs(x = xlab, y = name) + ggplot2::ggtitle(RowNames[i]) + ggplot2::theme_bw() if ((df[1, "x"] - df[(dim(df)[1]), "x"]) > 0) { plots[[name]] <- plots[[name]] + ggplot2::scale_x_reverse() } } else { if (n == 1 ) { melted <- data.frame(rowname = rep(name, m), Var = as.numeric(scale), value = elements[[name]][i,]) } else if (last==i){ melted <- data.frame(rowname = rep(rownames(elements[[name]])[i], m), Var = as.numeric(scale), value = elements[[name]][i,]) } else {melted <- reshape2::melt(elements[[name]][i:last, ], varnames = c("rowname", "Var")) } plots[[name]] <- ggplot2::ggplot(data = melted, ggplot2::aes(x = Var, y = value)) + ggplot2::geom_line(size = 0.3) + ggplot2::facet_grid(rowname ~ ., scales = "free_y") + ggplot2::theme(legend.position = "none") + ggplot2::labs(x = xlab, y = name) + ggplot2::ggtitle(label = main) + ggplot2::theme_bw() if ((melted[1, "Var"] - melted[(dim(melted)[1]), "Var"]) > 0) { plots[[name]] <- plots[[name]] + ggplot2::scale_x_reverse() } } } if (subtype == "stacked") { do.call(gridExtra::grid.arrange, c(plots, list(nrow = nrow, ncol = ncol))) } i <- last + 1 } } else if (subtype %in% c("together", "diffmean", "diffmedian", "diffwith")) { # TOGHETER or DIFFMEAN or DIFFMEDIAN or DIFFWITH =============== rainbow_colors <- grDevices::rainbow(n) if (createWindow) { grDevices::dev.new(noRStudioGD = TRUE) } graphics::par(mfrow = c(nrow, ncol)) plots <- list() # Loop for Re, Im, Mod and Arg for (name in names(elements)) { # Get this part of the signal element <- elements[[name]] # Express the signal according to a reference if asked by `subtype' if (subtype == "diffmean") { element <- sweep(element, MARGIN = 2, colMeans(element), `-`) } else if (subtype == "diffmedian") { element <- sweep(element, MARGIN = 2, matrixStats::colMedians(element), `-`) } else if (subtype == "diffwith") { element <- sweep(element, MARGIN = 2, element[row, ], `-`) if (row == 1 & n > 1) { # Since we use plot on the first row and lines on the following, the y # scale is calculated at the first row so if the first row is all 0, it # causes problems tmp <- element[1, ] element[1, ] <- element[2, ] element[2, ] <- tmp } } melted <- reshape2::melt(elements[[name]], varnames = c("rowname", "Var")) plots[[name]] <- ggplot2::ggplot(melted, ggplot2::aes(x = Var, y = value, group = rowname, colour = rowname)) + ggplot2::geom_line() + ggplot2::labs(x = xlab, y = name) + ggplot2::scale_colour_discrete(name = NULL) + ggplot2::ggtitle(main) if ((melted[1, "Var"] - melted[(dim(melted)[1]), "Var"]) > 0) { plots[[name]] <- plots[[name]] + ggplot2::scale_x_reverse() } do.call(gridExtra::grid.arrange, c(plots, list(nrow = nrow, ncol = ncol))) } } }