Mercurial > repos > marie-tremblay-metatoul > nmr_preprocessing
comparison DrawFunctions.R @ 2:5e64657b4fe5 draft
planemo upload for repository https://github.com/workflow4metabolomics/nmr_preprocessing commit 22ca8782d7c4c0211e13c95b425d4f29f53f995e
| author | lecorguille |
|---|---|
| date | Wed, 28 Mar 2018 08:05:12 -0400 |
| parents | |
| children | 122df1bf0a8c |
comparison
equal
deleted
inserted
replaced
| 1:cbea5e9fd0b4 | 2:5e64657b4fe5 |
|---|---|
| 1 require(ggplot2) | |
| 2 require(gridExtra) | |
| 3 require(reshape2) | |
| 4 | |
| 5 | |
| 6 Draw <- function(Signal_data, type.draw = c("signal", "pca"), output = c("default", | |
| 7 "window", "png", "pdf"), dirpath = ".", filename = "%003d", height = 480, | |
| 8 width = 640, pdf.onefile = TRUE, ...) { | |
| 9 | |
| 10 # Data initialisation and checks ---------------------------------------------- | |
| 11 type.draw <- match.arg(type.draw) | |
| 12 output <- match.arg(output) | |
| 13 fullpath <- paste(file.path(dirpath, filename), output, sep = ".") | |
| 14 createFile <- TRUE | |
| 15 createWindow <- FALSE | |
| 16 | |
| 17 # Drawing -------------------------------------------------------------------- | |
| 18 # output | |
| 19 switch(output, default = { | |
| 20 createFile <- FALSE | |
| 21 }, window = { | |
| 22 createWindow <- TRUE | |
| 23 createFile <- FALSE | |
| 24 }, png = { | |
| 25 grDevices::png(fullpath, width, height) | |
| 26 }, pdf = { | |
| 27 grDevices::pdf(fullpath, width = width/72, height = height/72, | |
| 28 onefile = pdf.onefile) | |
| 29 }, { | |
| 30 stop("Unknown output type.") | |
| 31 }) | |
| 32 | |
| 33 # Drawing type (signal/spectrum or PCA) | |
| 34 funs <- list(signal = DrawSignal, pca = DrawPCA) | |
| 35 if (type.draw %in% names(funs)) { | |
| 36 fun <- funs[[type.draw]] | |
| 37 } else { | |
| 38 stop(paste("Unknown type:", type.draw)) | |
| 39 } | |
| 40 | |
| 41 # Plot finalisation ---------------------------------------------- | |
| 42 if (is.vector(Signal_data)) { | |
| 43 Signal_data <- vec2mat(Signal_data) | |
| 44 } | |
| 45 fun(Signal_data, createWindow = createWindow, ...) | |
| 46 if (createFile) { | |
| 47 grDevices::dev.off() | |
| 48 } | |
| 49 } | |
| 50 | |
| 51 | |
| 52 | |
| 53 ##### DrawSignal | |
| 54 | |
| 55 DrawSignal <- function(Signal_data, subtype = c("stacked", "together", | |
| 56 "separate", "diffmean", "diffmedian", "diffwith"), | |
| 57 ReImModArg = c(TRUE, FALSE, FALSE, FALSE), vertical = T, | |
| 58 xlab = "rowname", RowNames = NULL, row = 1, num.stacked = 4, | |
| 59 main = NULL, createWindow) { | |
| 60 # nticks | |
| 61 | |
| 62 # Data initialisation and checks ---------------------------------------------- | |
| 63 | |
| 64 subtype <- match.arg(subtype) | |
| 65 vec <- is.vector(Signal_data) | |
| 66 if (vec) { | |
| 67 Signal_data <- vec2mat(Signal_data) | |
| 68 } | |
| 69 | |
| 70 n <- nrow(Signal_data) | |
| 71 m <- ncol(Signal_data) | |
| 72 | |
| 73 if (n < num.stacked){ | |
| 74 num.stacked <- n | |
| 75 } | |
| 76 | |
| 77 scale <- colnames(Signal_data) | |
| 78 | |
| 79 num.plot <- sum(ReImModArg) | |
| 80 | |
| 81 Var <- rowname <- value <- NULL # only for R CMD check | |
| 82 | |
| 83 # Drawing array | |
| 84 if (num.plot <= 0) { | |
| 85 stop("Nothing selected in ReImModArg.") | |
| 86 } else if (num.plot <= 2) { | |
| 87 if (vertical) { | |
| 88 nrow <- num.plot | |
| 89 ncol <- 1 | |
| 90 } else { | |
| 91 nrow <- 1 | |
| 92 ncol <- num.plot | |
| 93 } | |
| 94 } else { | |
| 95 nrow <- 2 | |
| 96 ncol <- 2 | |
| 97 } | |
| 98 | |
| 99 # RowNames | |
| 100 if (is.null(RowNames)) { | |
| 101 RowNames <- rownames(Signal_data) | |
| 102 if (is.null(RowNames)) { | |
| 103 RowNames <- 1:n | |
| 104 } | |
| 105 } else { | |
| 106 if (!is.vector(RowNames)) { | |
| 107 stop("RowNames is not a vector") | |
| 108 } | |
| 109 if (length(RowNames) != n) { | |
| 110 stop(paste("RowNames has length", length(RowNames), "and there are", n, "FIDs.")) | |
| 111 } | |
| 112 } | |
| 113 | |
| 114 if (n == 1) { | |
| 115 RowNames <- deparse(substitute(Signal_data)) | |
| 116 } | |
| 117 | |
| 118 elements <- list() | |
| 119 if (ReImModArg[1]) { | |
| 120 elements[["Re"]] <- Re(Signal_data) | |
| 121 rownames(elements[["Re"]]) <- RowNames | |
| 122 } | |
| 123 if (ReImModArg[2]) { | |
| 124 elements[["Im"]] <- Im(Signal_data) | |
| 125 rownames(elements[["Im"]]) <- RowNames | |
| 126 } | |
| 127 if (ReImModArg[3]) { | |
| 128 elements[["Mod"]] <- Mod(Signal_data) | |
| 129 rownames(elements[["Mod"]]) <- RowNames | |
| 130 } | |
| 131 if (ReImModArg[4]) { | |
| 132 elements[["Arg"]] <- Arg(Signal_data) | |
| 133 rownames(elements[["Arg"]]) <- RowNames | |
| 134 } | |
| 135 | |
| 136 | |
| 137 | |
| 138 | |
| 139 # Drawing -------------------------------------------------------------------- | |
| 140 | |
| 141 y = x = NULL # only for R CMD check | |
| 142 | |
| 143 | |
| 144 # SEPARATE or STACKED =============== | |
| 145 if (subtype == "separate" | subtype == "stacked") { | |
| 146 | |
| 147 i <- 1 | |
| 148 while (i <= n) { | |
| 149 if (createWindow) { | |
| 150 grDevices::dev.new(noRStudioGD = TRUE) | |
| 151 } | |
| 152 if (subtype == "separate") { | |
| 153 # The other uses gridExtra to do that | |
| 154 graphics::par(mfrow = c(nrow, ncol)) | |
| 155 } | |
| 156 plots <- list() | |
| 157 if (subtype == "separate") { | |
| 158 last <- i | |
| 159 } else { | |
| 160 last <- min(i + num.stacked - 1, n) | |
| 161 } | |
| 162 for (name in names(elements)) { | |
| 163 if (subtype == "separate") { | |
| 164 if (n == 1) { | |
| 165 df <- data.frame(x = as.numeric(scale), y = elements[[name]]) | |
| 166 } else {df <- data.frame(x = as.numeric(scale), y = elements[[name]][i, ]) | |
| 167 } | |
| 168 | |
| 169 plots[[name]] <- ggplot2::ggplot(data = df, ggplot2::aes(x = x, y = y)) + | |
| 170 ggplot2::geom_line(size = 1) + | |
| 171 ggplot2::theme(legend.position = "none") + | |
| 172 ggplot2::labs(x = xlab, y = name) + | |
| 173 ggplot2::ggtitle(RowNames[i]) + | |
| 174 ggplot2::theme_bw() | |
| 175 | |
| 176 if ((df[1, "x"] - df[(dim(df)[1]), "x"]) > 0) { | |
| 177 plots[[name]] <- plots[[name]] + ggplot2::scale_x_reverse() | |
| 178 } | |
| 179 | |
| 180 } else { | |
| 181 | |
| 182 if (n == 1 ) { | |
| 183 melted <- data.frame(rowname = rep(name, m), | |
| 184 Var = as.numeric(scale), value = elements[[name]][i,]) | |
| 185 } else if (last==i){ | |
| 186 melted <- data.frame(rowname = rep(rownames(elements[[name]])[i], m), | |
| 187 Var = as.numeric(scale), value = elements[[name]][i,]) | |
| 188 } else {melted <- reshape2::melt(elements[[name]][i:last, ], | |
| 189 varnames = c("rowname", "Var")) | |
| 190 } | |
| 191 | |
| 192 | |
| 193 plots[[name]] <- ggplot2::ggplot(data = melted, ggplot2::aes(x = Var, y = value)) + | |
| 194 ggplot2::geom_line(size = 0.3) + | |
| 195 ggplot2::facet_grid(rowname ~ ., scales = "free_y") + | |
| 196 ggplot2::theme(legend.position = "none") + | |
| 197 ggplot2::labs(x = xlab, y = name) + | |
| 198 ggplot2::ggtitle(label = main) + | |
| 199 ggplot2::theme_bw() | |
| 200 | |
| 201 if ((melted[1, "Var"] - melted[(dim(melted)[1]), "Var"]) > 0) { | |
| 202 plots[[name]] <- plots[[name]] + ggplot2::scale_x_reverse() | |
| 203 } | |
| 204 } | |
| 205 } | |
| 206 | |
| 207 if (subtype == "stacked") { | |
| 208 do.call(gridExtra::grid.arrange, c(plots, list(nrow = nrow, ncol = ncol))) | |
| 209 } | |
| 210 | |
| 211 i <- last + 1 | |
| 212 } | |
| 213 } else if (subtype %in% c("together", "diffmean", "diffmedian", "diffwith")) { | |
| 214 | |
| 215 # TOGHETER or DIFFMEAN or DIFFMEDIAN or DIFFWITH =============== | |
| 216 | |
| 217 rainbow_colors <- grDevices::rainbow(n) | |
| 218 | |
| 219 if (createWindow) { | |
| 220 grDevices::dev.new(noRStudioGD = TRUE) | |
| 221 } | |
| 222 graphics::par(mfrow = c(nrow, ncol)) | |
| 223 | |
| 224 plots <- list() | |
| 225 | |
| 226 # Loop for Re, Im, Mod and Arg | |
| 227 for (name in names(elements)) { | |
| 228 # Get this part of the signal | |
| 229 element <- elements[[name]] | |
| 230 | |
| 231 # Express the signal according to a reference if asked by `subtype' | |
| 232 if (subtype == "diffmean") { | |
| 233 element <- sweep(element, MARGIN = 2, colMeans(element), `-`) | |
| 234 } else if (subtype == "diffmedian") { | |
| 235 element <- sweep(element, MARGIN = 2, matrixStats::colMedians(element), `-`) | |
| 236 } else if (subtype == "diffwith") { | |
| 237 element <- sweep(element, MARGIN = 2, element[row, ], `-`) | |
| 238 if (row == 1 & n > 1) { | |
| 239 # Since we use plot on the first row and lines on the following, the y | |
| 240 # scale is calculated at the first row so if the first row is all 0, it | |
| 241 # causes problems | |
| 242 tmp <- element[1, ] | |
| 243 element[1, ] <- element[2, ] | |
| 244 element[2, ] <- tmp | |
| 245 } | |
| 246 } | |
| 247 | |
| 248 | |
| 249 melted <- reshape2::melt(elements[[name]], varnames = c("rowname", "Var")) | |
| 250 | |
| 251 | |
| 252 plots[[name]] <- ggplot2::ggplot(melted, ggplot2::aes(x = Var, | |
| 253 y = value, group = rowname, colour = rowname)) + ggplot2::geom_line() + | |
| 254 ggplot2::labs(x = xlab, y = name) + ggplot2::scale_colour_discrete(name = NULL) + | |
| 255 ggplot2::ggtitle(main) | |
| 256 | |
| 257 if ((melted[1, "Var"] - melted[(dim(melted)[1]), "Var"]) > | |
| 258 0) { | |
| 259 plots[[name]] <- plots[[name]] + ggplot2::scale_x_reverse() | |
| 260 } | |
| 261 | |
| 262 do.call(gridExtra::grid.arrange, c(plots, list(nrow = nrow, | |
| 263 ncol = ncol))) | |
| 264 } | |
| 265 } | |
| 266 | |
| 267 | |
| 268 } |
