SuperImpose直方图适合一个图ggplot

时间:2012-12-01 15:58:04

标签: r plot histogram ggplot2

我有~5个非常大的向量(~108个MM条目)所以我在R中用它们做的任何情节/东西需要相当长的时间。

我正在尝试将它们的分布(直方图)可视化,并且想知道在不花费太长时间的情况下将它们的直方图分布叠加在R中的最佳方法是什么。我想首先在直方图上拟合一个分布,然后在一个图中将所有分布线拟合在一起。

你对如何做到有什么建议吗?

让我们说我的载体是:

x1, x2, x3, x4, x5.

我正在尝试使用此代码:Overlaying histograms with ggplot2 in R

我用于3个向量的代码示例(R未能完成绘图):

n = length(x1)
dat <- data.frame(xx = c(x1, x2, x3),yy = rep(letters[1:3],each = n))
ggplot(dat,aes(x=xx)) + 
    geom_histogram(data=subset(dat,yy == 'a'),fill = "red", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'b'),fill = "blue", alpha = 0.2) +
    geom_histogram(data=subset(dat,yy == 'c'),fill = "green", alpha = 0.2)

但是制作情节需要花费很长时间,并最终将我从R中踢出来。关于如何有效地使用ggplot2进行大型矢量的任何想法?在我看来,我必须创建一个5 * 108MM条目的数据框,然后绘制,在我的情况下非常低效。

谢谢!

1 个答案:

答案 0 :(得分:20)

这里有一小段Rcpp可以非常有效地存储数据 - 在我的计算机上需要大约一秒钟就可以获得100,000,000次观察:

library(Rcpp)
cppFunction('
  std::vector<int> bin3(NumericVector x, double width, double origin = 0) {
    int bin, nmissing = 0;
    std::vector<int> out;

    NumericVector::iterator x_it = x.begin(), x_end;
    for(; x_it != x.end(); ++x_it) {
      double val = *x_it;
      if (ISNAN(val)) {
        ++nmissing;
      } else {
        bin = (val - origin) / width;
        if (bin < 0) continue;

        // Make sure there\'s enough space
        if (bin >= out.size()) {
          out.resize(bin + 1);
        }
        ++out[bin];
      }
    }

    // Put missing values in the last position
    out.push_back(nmissing);
    return out;
  }
')

x8 <- runif(1e8)
system.time(bin3(x8, 1/100))
#   user  system elapsed 
#  1.373   0.000   1.373 

那就是说hist在这里也很快:

system.time(hist(x8, breaks = 100, plot = F))
#   user  system elapsed 
#  7.281   1.362   8.669 

使用bin3制作直方图或频率多边形非常简单:

# First we create some sample data, and bin each column

library(reshape2)
library(ggplot2)

df <- as.data.frame(replicate(5, runif(1e6)))
bins <- vapply(df, bin3, 1/100, FUN.VALUE = integer(100 + 1))

# Next we match up the bins with the breaks
binsdf <- data.frame(
  breaks = c(seq(0, 1, length = 100), NA),
  bins)

# Then melt and plot
binsm <- subset(melt(binsdf, id = "breaks"), !is.na(breaks))
qplot(breaks, value, data = binsm, geom = "line", colour = variable)

仅供参考,我手头有bin3的原因是我正在研究如何使这个速度成为ggplot2中的默认值:)