Insert blanks into a vector for, e.g., minor tick labels in R

前端 未结 1 1826
我寻月下人不归
我寻月下人不归 2020-12-01 06:46

This question relates generally to a previous SO question concerning the creation of minor tick marks on a ggplot2 axis and specifically to a comment in the ans

相关标签:
1条回答
  • 2020-12-01 07:31

    The following function allows the user to request that every nth element nth of a vector x either be (1) replaced with a empty character placeholder (empty = TRUE; default) or (2) omitted from the vector (empty = FALSE). Additionally, it provides the option of requesting the inverse (inverse = TRUE; not default) of the operation. The functionality is illustrated with some examples below.

    First, the function:

    every_nth <- function(x, nth, empty = TRUE, inverse = FALSE) 
      {
      if (!inverse) {
        if(empty) {
          x[1:nth == 1] <- ""
          x
          } else {
            x[1:nth != 1]
            }
        } else {
          if(empty) {
            x[1:nth != 1] <- ""
            x
            } else {
              x[1:nth == 1]
            }
        }
    }
    

    Some examples of replacing or omitting vector elements:

    numvec <- 0:20
    charvec <- LETTERS
    
    ## Replace every 3rd element with an empty character
    every_nth(numvec, 3) # conversion to character vector
    
    [1] ""   "1"  "2"  ""   "4"  "5"  ""   "7"  "8"  ""   "10" "11" ""   "13"
    [15] "14" ""   "16" "17" ""   "19" "20"
    
    every_nth(charvec, 3)
    [1] ""  "B" "C" ""  "E" "F" ""  "H" "I" ""  "K" "L" ""  "N" "O" ""  "Q"
    [18] "R" ""  "T" "U" ""  "W" "X" ""  "Z"
    
    ## Omit (drop) every 3rd element
    every_nth(numvec, 3, empty = FALSE) # vector mode is preserved
    [1]  1  2  4  5  7  8 10 11 13 14 16 17 19 20
    
    every_nth(charvec, 3, empty = FALSE)
    [1] "B" "C" "E" "F" "H" "I" "K" "L" "N" "O" "Q" "R" "T" "U" "W" "X" "Z"
    

    However, for the creation of minor ticks, it is preferred to return the inverse of this operation using the inverse = TRUE option:

    ## Retain every 3rd element, replacing all others with an empty character
    every_nth(numvec, 3, inverse = TRUE) # conversion to character vector
    [1] "0"  ""   ""   "3"  ""   ""   "6"  ""   ""   "9"  ""   ""   "12" ""  
    [15] ""   "15" ""   ""   "18" ""   ""
    
    every_nth(charvec, 3, inverse = TRUE)
    [1] "A" ""  ""  "D" ""  ""  "G" ""  ""  "J" ""  ""  "M" ""  ""  "P" "" 
    [18] ""  "S" ""  ""  "V" ""  ""  "Y" ""
    
    ## Retain every 3rd element, omitting (dropping) all other elements
    every_nth(numvec, 3, empty = FALSE, inverse = TRUE) # vector mode is preserved
    [1]  0  3  6  9 12 15 18
    
    every_nth(charvec, 3, empty = FALSE, inverse = TRUE)
    [1] "A" "D" "G" "J" "M" "P" "S" "V" "Y"
    

    To illustrate the function's use in the creation of minor ticks:

    library(ggplot2)
    df <- data.frame(x = rnorm(1000), y = rnorm(1000))
    
    ## ggplot2 default axis labelling
    p <- ggplot(df, aes(x, y)) + geom_point() + theme_bw()
    p
    

    default labelling

    ## Add minor ticks to axes
    custom_breaks <- seq(-3, 3, 0.25)
    p + 
      scale_x_continuous(breaks = custom_breaks,
                         labels = every_nth(custom_breaks, 4, inverse = TRUE)) + 
      scale_y_continuous(breaks = custom_breaks,
                         labels = every_nth(custom_breaks, 2, inverse = TRUE)) 
    

    custom labelling

    0 讨论(0)
提交回复
热议问题