diff --git a/cute_little_R_functions.R b/cute_little_R_functions.R index 1be8c3cab8aeeb6ee3d13c3b20f524623e45ad11..43f91549dd8648c3e49c573ed19aee70c96384a7 100644 --- a/cute_little_R_functions.R +++ b/cute_little_R_functions.R @@ -6975,22 +6975,14 @@ return(output) # do not use cat() because the idea is to reuse the message - - - - - - - - - - # add legend width. Ok with facet ? # add modif of warn from scatter (remove all FROM and put it at the begining) # transfert the 2nd tick part to scatter +# # problem of y-axis label disappearance with y.lim decreasing (indicated in blue) + fun_gg_boxplot <- function( data1, @@ -7152,6 +7144,7 @@ lib.path = NULL # $panel: the variable names used for the panels (NULL if no panels). BEWARE: NA can be present according to ggplot2 upgrade to v3.3.0 # $axes: the x-axis and y-axis info # $warn: the warning messages. Use cat() for proper display. NULL if no warning. BEWARE: some of the warning messages (those delivered by the internal ggplot2 functions) are not apparent when using the argument plot = FALSE +# $ggplot: ggplot object that can be used for reprint (use print($ggplot) or update (use $ggplot + ggplot2::...) # EXAMPLE # obs1 <- data.frame(x = 1:20, Group1 = rep(c("G", "H"), times = 10), Group2 = rep(c("A", "B"), each = 10)) ; fun_gg_boxplot(data1 = obs1, y = "x", categ = c("Group1", "Group2"), categ.class.order = list(NULL, c("B", "A")), categ.legend.name = "", categ.color = c("red", "blue"),box.fill = FALSE, box.width = 0.5, box.space = 0.1, box.line.size = 0.5, box.notch = FALSE, box.alpha = 1, box.mean = TRUE, box.whisker.kind = "std", box.whisker.width = 0, dot.color = "black", dot.categ = NULL, dot.categ.class.order = NULL, dot.categ.legend.name = NULL, dot.tidy = TRUE, dot.tidy.bin.nb = 50, dot.jitter = 0.5, dot.size = 3, dot.alpha = 0.5, dot.border.size = 0.5, dot.border.color = NULL, x.lab = NULL, y.lab = NULL, y.lim = NULL, y.log = "no", y.tick.nb = NULL, y.inter.tick.nb = NULL, y.include.zero = FALSE, y.top.extra.margin = 0.05, y.bottom.extra.margin = 0.05, stat.disp = NULL, stat.disp.mean = FALSE, stat.size = 4, stat.dist = 2, vertical = TRUE, text.size = 12, text.angle = 0, title = "", title.text.size = 8, article = TRUE, grid = FALSE, return = FALSE, plot = TRUE, add = NULL, warn.print = TRUE, lib.path = NULL) # DEBUGGING @@ -8582,14 +8575,15 @@ stop(tempo.cat) # y scale management (cannot be before dot plot management) if(vertical == TRUE){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(ylim = y.lim)) # clip = "off" to have secondary ticks outside plot region does not work +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(ylim = y.lim)) # inactivated because trans = ifelse(diff(y.lim) < 0, "reverse", "identity") is the same # clip = "off" to have secondary ticks outside plot region does not work # create the problem of y-axis label disappearance with y.lim decreasing }else{ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_flip(ylim = y.lim)) # clip = "off" to have secondary ticks outside plot region does not work +assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_flip(ylim = y.lim)) # clip = "off" to have secondary ticks outside plot region does not work # create the problem of y-axis label disappearance with y.lim decreasing + } # secondary ticks (after ggplot2::coord_cartesian() or ggplot2::coord_flip()) tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$layout$panel_params[[1]] # y.inter.tick.positions: coordinates of secondary ticks (only if y.inter.tick.nb argument is non NULL or if y.log argument is different from "no") -if(is.null(y.tick.nb) & y.log != "no"){ # integer main ticks for log2 and log10 +if(y.log != "no"){ # integer main ticks for log2 and log10 tempo.scale <- (as.integer(min(y.lim, na.rm = TRUE)) - 1):(as.integer(max(y.lim, na.rm = TRUE)) + 1) }else{ tempo <- if(is.null(attributes(tempo.coord$y$breaks))){tempo.coord$y$breaks}else{unlist(attributes(tempo.coord$y$breaks))} @@ -8628,8 +8622,8 @@ breaks = tempo.scale, minor_breaks = y.inter.tick.pos, labels = if(y.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(y.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(y.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("\n\n============\n\nINTERNAL CODE ERROR IN ", function.name, ": CODE INCONSISTENCY 10\n\n============\n\n") ; stop(tempo.cat)}, expand = c(0, 0), # remove space after after axis limits -limits = NA, # indicate that limits must correspond to data limits -trans = ifelse(diff(y.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() +limits = NULL, # indicate that limits must correspond to data limits +trans = ifelse(diff(y.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() # create the problem of y-axis label disappearance with y.lim decreasing )) # end y scale management (cannot be before dot plot management) @@ -8674,21 +8668,21 @@ if(warn.print == TRUE & ! is.null(warn)){ warning(paste0("FROM ", function.name, " FUNCTION:\n\n", warn), call. = FALSE) # to recover the warning messages, use return = TRUE } if(return == TRUE){ -output <- ggplot2::ggplot_build(fin.plot) -output$data <- output$data[-1] # remove the first data because corresponds to the initial empty boxplot -if(length(output$data) != length(coord.names)){ -tempo.cat <- paste0("\n\n================\n\nINTERNAL CODE ERROR IN ", function.name, ": length(output$data) AND length(coord.names) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED\n\n================\n\n") +tempo.output <- ggplot2::ggplot_build(fin.plot) +tempo.output$data <- tempo.output$data[-1] # remove the first data because corresponds to the initial empty boxplot +if(length(tempo.output$data) != length(coord.names)){ +tempo.cat <- paste0("\n\n================\n\nINTERNAL CODE ERROR IN ", function.name, ": length(tempo.output$data) AND length(coord.names) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED\n\n================\n\n") stop(tempo.cat) }else{ -names(output$data) <- coord.names +names(tempo.output$data) <- coord.names } -tempo <- output$layout$panel_params[[1]] +tempo <- tempo.output$layout$panel_params[[1]] output <- list( data = data1, stat = stat, removed.row.nb = removed.row.nb, removed.rows = removed.rows, -plot = c(output$data, y.inter.tick.values = list(y.inter.tick.values)), +plot = c(tempo.output$data, y.inter.tick.values = list(y.inter.tick.values)), panel = facet.categ, axes = list( x.range = tempo$x.range, @@ -8698,7 +8692,8 @@ y.range = tempo$y.range, y.labels = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{tempo$y$scale$get_labels()}, y.positions = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{unlist(attributes(tempo$y$breaks))} ), -warn = paste0("\n", warn, "\n\n") +warn = paste0("\n", warn, "\n\n"), +ggplot = fin.plot ) return(output) } @@ -8708,3 +8703,6 @@ return(output) + + + diff --git a/fun_gg_boxplot.docx b/fun_gg_boxplot.docx index 71245df1fd74f732251a457eac9b25cacf1771ae..29704ee62c9814596dfc0a6866882ff198665a7d 100644 Binary files a/fun_gg_boxplot.docx and b/fun_gg_boxplot.docx differ