You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
2.0 KiB
61 lines
2.0 KiB
#' Makes axis text labels flush on the ends
|
|
#'
|
|
#' A covenience function intended for basic, fixed-scale plots only (i.e. does not handle
|
|
#' free scales in facets).\cr
|
|
#' \cr
|
|
#' You need to pass in a ggplot2 object to this function. It can't be `+`'d in a chain
|
|
#' of geoms, coords, scales, themes, etc. It also builds the plot (but does not display
|
|
#' it) so if the plt takes a while (i.e. has lots of data or transforms) this will also
|
|
#' take a while.
|
|
#'
|
|
#' @md
|
|
#' @param gg ggplot2 plot object
|
|
#' @param flush either "`X`" or "`Y`" or "`XY`" to flush individual or both axes. Default: both.
|
|
#' @param plot if `FALSE` then the ggplot object will be returned _invisibly_
|
|
#' @param cat if `TRUE` then display `theme()` statements and copy them to the clipboard
|
|
#' @return ggplot2 object with `theme()` elements added
|
|
#' @note Intended for basic, fixed-scale plots only (i.e. does not handle free scales in facets).
|
|
#' @export
|
|
flush_ticks <- function(gg, flush="XY", plot=TRUE, cat=TRUE) {
|
|
|
|
if (!inherits(gg, "ggplot")) return(gg)
|
|
|
|
flush <- unique(toupper(strsplit("XY", "")[[1]]))
|
|
flush <- flush[flush %in% c("X", "Y")]
|
|
|
|
has_x <- any("X" %in% flush)
|
|
has_y <- any("Y" %in% flush)
|
|
|
|
gb <- ggplot_build(gg)
|
|
|
|
nx <- gb$layout$panel_scales_x[[1]]$break_info()
|
|
nx <- length(nx$labels)
|
|
|
|
ny <- gb$layout$panel_scales_y[[1]]$break_info()
|
|
ny <- length(ny$labels)
|
|
|
|
mid_x <- if ((nx - 2) > 0) (nx - 2) else 0
|
|
mid_y <- if ((ny - 2) > 0) (ny - 2) else 0
|
|
|
|
stmts <- NULL
|
|
|
|
if (has_x & (nx>1)) {
|
|
gg <- gg + theme(axis.text.x=element_text(hjust=c(0, rep(0.5, mid_x), 1)))
|
|
if (cat) {
|
|
stmts <- c(NULL, sprintf("theme(axis.text.x=element_text(hjust=c(0, rep(0.5, %s), 1)))", mid_x))
|
|
}
|
|
}
|
|
|
|
if (has_y & (ny>1)) {
|
|
gg <- gg + theme(axis.text.y=element_text(vjust=c(0, rep(0.5, mid_y), 1)))
|
|
stmts <- c(stmts, sprintf("theme(axis.text.y=element_text(vjust=c(0, rep(0.5, %s), 1)))", mid_y))
|
|
}
|
|
|
|
if (cat) {
|
|
stmts <- paste0(stmts, collapse=" +\n")
|
|
cat(stmts, sep="\n")
|
|
}
|
|
|
|
if (plot) gg else invisible(gg)
|
|
|
|
}
|
|
|