这个问题一般涉及先前关于在轴上创建次刻度标记的SO问题ggplot2
,特别是对该问题的答案中的注释,表明将空白插入序列的功能可能证明是有用的.
由于我经常在类似的情节中添加小刻度标记,因此我尝试创建这样的函数(请参阅下面的答案).
以下函数允许用户请求向量的每个第n 个元素(1)替换为空字符占位符(;默认值)或(2)从向量()中省略.另外,它提供了请求操作的反向(而非默认)的选项.下面通过一些示例说明功能.nth
x
empty = TRUE
empty = FALSE
inverse = TRUE
一,功能:
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] } } }
替换或省略向量元素的一些示例:
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"
但是,对于创建次要刻度,最好使用以下inverse = TRUE
选项返回此操作的反转:
## 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"
为了说明函数在创建次要刻度时的用法:
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
## 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))