多年来,这个问题在 StackOverflow 上被多次提出(参见此处和此处),但是我还没有找到一种令我满意的方法,可以轻松地将未标记的小刻度添加到我的 ggplot 轴上。
让我们生成一些虚拟数据来玩一下:
df <- data.frame(x = rnorm(1000, mean = 25, sd = 5),
y = rnorm(1000, mean = 23, sd = 3))
Run Code Online (Sandbox Code Playgroud)
我遇到过两种添加未标记的小刻度的方法。
方法 1 - 手动构造轴标签向量
将您希望在主要刻度处显示的值与使用 定义的空格连接起来""。如果您只想在主要刻度值之间添加一个未标记的次要刻度,您可以像这样构造轴标签向量:
axis_values <- c(0, "", 10, "", 20, "", 30, "", 40, "", 50)
Run Code Online (Sandbox Code Playgroud)
或者,如果您想要n 个未标记的小刻度:
# Where n = 2 and for an axis range [0, 50]
axis_values <- c(0, rep("", 2), 15, rep("", 2), 30, rep("", 2), 45, "")
Run Code Online (Sandbox Code Playgroud)
然后,用户可以将此向量提供给 ggplot2::scale_x_continuous 或 ggplot2::scale_y_continuous 函数中的 'labels' 参数,只要标签向量的长度与提供给 'breaks' 参数的向量的长度相匹配相同的功能。
ggplot(df, aes(x = x, y = y)) +
geom_point() +
scale_x_continuous(breaks = seq(0, 50, 5), labels = axis_values, limits = c(0, 50)) +
scale_y_continuous(breaks = seq(0, 50, 5), labels = axis_values, limits = c(0, 50))
Run Code Online (Sandbox Code Playgroud)
方法 2 - 定义自己的函数来生成轴标签向量
这篇文章描述了一个函数,用户可以向该函数提供一个出现在主要刻度处的值向量,以及所需的未标记次要刻度的数量:
insert_minor <- function(major_labs, n_minor) {
labs <- c( sapply( major_labs, function(x) c(x, rep("", n_minor) ) ) )
labs[1:(length(labs)-n_minor)]
}
# Generate plot
ggplot(df, aes(x = x, y = y)) +
geom_point() +
scale_x_continuous(breaks = seq(0, 50, 5), labels = insert_minor(major_labs = seq(0, 50, 10),
n_minor = 1), limits = c(0, 50)) +
scale_y_continuous(breaks = seq(0, 50, 5), labels = insert_minor(major_labs = seq(0, 50, 10),
n_minor = 1), limits = c(0, 50))
Run Code Online (Sandbox Code Playgroud)
方法 2 是我见过的生成未标记小刻度的最佳方法。但缺点是:
在我看来,理想的解决方案是 ggplot2 开发人员向scale_x_Continous或scale_y_Continous ggplot2函数添加一个参数,该函数采用用户定义的值作为用户想要添加到绘图轴的未标记次要刻度的数量,然后将其取提供给“breaks”参数的向量并确定用户视线之外的背景中的“major_labs”。
还有其他人找到了计算 ggplot2 中未标记的小刻度的任何其他方法吗?
一种快速、简单且有点时尚的解决方案是定义此单行标签函数,该函数仅显示在您选择的倍数处发生的中断:
label_at <- function(n) function(x) ifelse(x %% n == 0, x, "")
Run Code Online (Sandbox Code Playgroud)
所以你可以这样做:
ggplot(df, aes(x = x, y = y)) +
geom_point() +
scale_x_continuous(breaks = seq(0, 50, 5), labels = label_at(10),
limits = c(0, 50)) +
scale_y_continuous(breaks = seq(0, 50, 5), labels = label_at(5),
limits = c(0, 50))
Run Code Online (Sandbox Code Playgroud)
你很容易走向极端:
ggplot(df, aes(x = x, y = y)) +
geom_point() +
scale_x_continuous(breaks = seq(0, 50, 5), labels = label_at(10),
limits = c(0, 50)) +
scale_y_continuous(breaks = seq(0, 50, 5), labels = label_at(5),
limits = c(0, 50))
Run Code Online (Sandbox Code Playgroud)