在另一个函数中调用ggplot2美学

问题描述 投票:0回答:1

在基础 R 中,可以自动使用 Freedman-Diaconis 规则来设置直方图中的 bin 宽度:

hist(rnorm(100), breaks = "FD")

基本 ggplot 中似乎没有这种行为。我一直在尝试实现这个方法,以便更方便地与

geom_histogram
一起使用。

我希望能够修改该函数,以便可以在不指定原始数据框和列的情况下调用它。

bin_number <- function(data_vector = NULL) {

    if (is.null(data_vector)) {
        data_vector <- # something
    }

    bin_width <-
        2 * stats::IQR(data_vector) / (length(data_vector) ^ (1 / 3))
    number_bins <- ceiling(diff(range(data_vector)) / bin_width)

    return(number_bins)
}


df <- data.frame(xval = rnorm(100))

ggplot(data = df) +
    geom_histogram(
        mapping = aes(
            x = xval,
            y = after_stat(density)
        ),
        bins = bin_number()
    )

我已经浏览了 ggplot 文档,但我无法找到一种方法来轻松获得当前数据框的美观。

我当前的方法需要直接调用数据向量,这确实有效,但可能很笨拙,并使直方图的代码更难重现。

bin_number <- function(data_vector) {

    bin_width <-
        2 * stats::IQR(data_vector) / (length(data_vector) ^ (1 / 3))
    number_bins <- ceiling(diff(range(data_vector)) / bin_width)

    return(number_bins)
}


df <- data.frame(xval = rnorm(100))

ggplot(data = df) +
    geom_histogram(
        mapping = aes(
            x = xval,
            y = after_stat(density)
        ),
        bins = bin_number(df$xval)
    )

r ggplot2
1个回答
0
投票

如果你分两步创建情节,你绝对可以从审美对象中找回x审美。一种选择是首先创建美学对象,然后生成绘图并从 aes 对象中检索 x 美学:

my_aes<-aes(
  x = xval,
  y = after_stat(density)
)
ggplot(data = df) +
  geom_histogram(mapping=my_aes, 
                 bins=bin_number(df[,as_label(my_aes$x)]))
© www.soinside.com 2019 - 2024. All rights reserved.