gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:16:46 27 4
gpt4 key购买 nike

多年来,这个问题在 StackOverflow 上被多次提出(参见 herehere),但是我还没有遇到一种我满意的方法,可以轻松地将未标记的小刻度添加到我的 ggplot轴。
让我们生成一些虚拟数据来处理:

df <- data.frame(x = rnorm(1000, mean = 25, sd = 5),
y = rnorm(1000, mean = 23, sd = 3))
我遇到过两种添加未标记小刻度的方法。
方法一——手动构建轴标签向量
使用 "" 定义的空格连接您希望出现在主要刻度上的值.如果您只想在主要刻度值之间添加一个未标记的小刻度,您可以像这样构造轴标签的向量:
axis_values <- c(0, "", 10, "", 20, "", 30, "", 40, "", 50)
或者,如果您想要 n 个未标记的小刻度:
# Where n = 2 and for an axis range [0, 50]

axis_values <- c(0, rep("", 2), 15, rep("", 2), 30, rep("", 2), 45, "")
然后,用户可以将此向量提供给 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))
方法 2 - 定义自己的函数来生成轴标签向量
post描述了一个函数,用户可以向该函数提供一个值向量以显示在主要刻度上,以及所需的未标记次刻度数:
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))
方法 2 是我见过的生成未标记小刻度的最佳方法。但是缺点是:
  • Not dummy-proof - 用户需要确保给 'n_minor' 参数的值与提供给 'breaks' 和 'major_labs' 参数的数据兼容。说我懒惰,但当我试图快速制作情节时,我不想考虑这个。
  • 需要函数管理 - 当你想在另一个脚本中使用这个函数时,你必须
    从您使用它的最后一个脚本中检索它,或者您也可以将其打包在一个库中以在将来的脚本中调用。

  • 在我看来,理想的解决方案是 ggplot2 开发人员向 scale_x_continuous 或 scale_y_continuous ggplot2 函数添加一个参数,该参数采用用户定义的值来表示用户想要添加到他们的绘图轴的未标记小刻度数,然后提供给 'breaks' 参数的向量,并在用户视线之外的背景中确定 'major_labs'。
    有没有其他人找到任何其他方法来计算 ggplot2 中未标记的小刻度?

    最佳答案

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

    label_at <- function(n) function(x) ifelse(x %% n == 0, x, "")
    所以你可以这样做:
    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))
    enter image description here
    你很容易走极端:
    ggplot(df, aes(x = x, y = y)) +
    geom_point() +
    scale_x_continuous(breaks = 1:50, labels = label_at(10), limits = c(0, 50)) +
    scale_y_continuous(breaks = 1:50, labels = label_at(10), limits = c(0, 50))
    enter image description here

    关于r - 在 ggplot2 中添加小刻度的快速、时尚和简单的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64174750/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com