在基础 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)
)
如果你分两步创建情节,你绝对可以从审美对象中找回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)]))