从 bin 和频率而不是样本开始在图中创建多个直方图?

Create multiple histograms in a plot starting from bins and frequencies, instead than from samples?

我有一个大小为 10^6x3 的数据框,即三个变量的 100 万个样本。我想在同一个图中创建三个直方图并使用 R 覆盖(alpha 混合?)。问题是在我的电脑上管理那么多样本是可能的(它们适合内存并且 R 不会永远挂起),但是不是快如闪电。生成样本的代码还返回了 bin 的下边界和上边界,以及相应的频率。当然,这是少得多的数据:我可以选择 bin 的数量,但假设变量有 30 个 bin,所以 30x2x3=180 加倍。 R 中是否有一种方法可以从 bin 和频率数据开始创建叠加直方图?我想使用 ggplot2,但我对使用 base R 或其他包的解决方案持开放态度。另外,如果你遇到我的情况,你会怎么做?你会使用原始样本,而不关心更长的计算 time/memory 占用吗?或者你会选择 bin/freqs 吗?我想使用原始数据,但我担心 R 会变得太慢或占用太多内存,这可能会在后续计算中产生问题。因此,使用原始数据但针对 speed/memory 进行优化的解决方案会很棒,否则可以使用 bin/freqs(如果可能的话!)。

是的,当然可以!使用 bin 和频率,您可以制作条形图。

dat <- data.frame(group = rep(c('a', 'b'), each = 10),
                  bin = rep(1:10, 2),
                  frequency = rnorm(20, 5))
library(ggplot2)

按照您的建议使用 alpha 混合:

ggplot(dat, aes(x = bin, y = frequency, fill = group)) + 
  geom_bar(stat = 'identity', position = position_identity(), alpha = 0.4)

或者我们躲开障碍物:

ggplot(dat, aes(x = bin, y = frequency, fill = group)) + 
  geom_bar(stat = 'identity', position = 'dodge')

我很好奇 "not lightning fast"。下面的数据集(1e6 个案例 X 3 个变量)在我的机器(Core i7、Win7 x64)上渲染时间约为 6 秒。是不是太慢了?

set.seed(1)    # for reproducible example
df <- data.frame(matrix(rnorm(3e6, mean=rep(c(0,3,6), each=1e6)), ncol=3))
names(df) <- c("A","B","C")

library(ggplot2)
library(reshape2)
gg.df <- melt(df, variable.name="category")

system.time({
  ggp <- ggplot(gg.df, aes(x=value, fill=category)) + 
    stat_bin(geom="bar", position="identity", alpha=0.7)
  plot(ggp)
})
#    user  system elapsed 
#    5.68    0.53    6.24