在 ggplot2 中添加小刻度的快速、时尚和简单的方法?

jbu*_*bur 6 r ggplot2

多年来,这个问题在 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 是我见过的生成未标记小刻度的最佳方法。但缺点是:

  1. 不是虚拟证明 - 用户需要确保赋予“n_minor”参数的值与提供给“breaks”和“major_labs”参数的数据兼容。你可以说我很懒,但当我试图快速绘制情节时,我不想考虑这一点。
  2. 需要函数管理 - 当您想在另一个脚本中使用此函数时,您必须从上一个使用它的脚本中检索它,或者您可以将其打包在一个库中以在将来的脚本中调用。

在我看来,理想的解决方案是 ggplot2 开发人员向scale_x_Continous或scale_y_Continous ggplot2函数添加一个参数,该函数采用用户定义的值作为用户想要添加到绘图轴的未标记次要刻度的数量,然后将其取提供给“breaks”参数的向量并确定用户视线之外的背景中的“major_labs”。

还有其他人找到了计算 ggplot2 中未标记的小刻度的任何其他方法吗?

All*_*ron 5

一种快速、简单且有点时尚的解决方案是定义此单行标签函数,该函数仅显示在您选择的倍数处发生的中断:

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)

在此输入图像描述