包装R的绘图功能(或ggplot2)以防止绘制大型数据集

时间:2011-10-15 17:33:59

标签: r plot ggplot2 bigdata

我不想询问如何绘制大数据集,而是要包装plot,以便生成大量图形的代码在绘制大型对象时不会受到重创。如何以非常简单的方式包装plot以保持其所有功能,但首先测试以确定传递的对象是否太大?

此代码适用于对plot的非常普通的调用,但它与plot缺少相同的通用性(见下文)。

myPlot <- function(x, ...){
    isBad <- any( (length(x) > 10^6) || (object.size(x) > 8*10^6) || (nrow(x) > 10^6) )
    if(is.na(isBad)){isBad = FALSE}
    if(isBad){
        stop("No plots for you!")
    }
    return(plot(x, ...))
}

x = rnorm(1000)
x = rnorm(10^6 + 1)

myPlot(x)

失败的例子:

x = rnorm(1000)
y = rnorm(1000)
plot(y ~ x)
myPlot(y ~ x)

是否有一些简单的方法来包装plot以启用对要绘制的数据的检查,同时仍然传递所有参数?如果没有,那么ggplot2怎么样?我是一个平等的机会非绘图员。 (在数据集很大的情况下,我将使用hexbin,子采样,密度图等,但这不是重点。)


注1:在测试创意时,我建议测试尺寸&gt; 100(或设置变量,例如myThreshold <- 1000),而不是大小>&gt; 1M - 否则在缓慢绘图方面会有很多痛苦。 :)

1 个答案:

答案 0 :(得分:6)

您遇到的问题是,按照当前编码,myplot()假设x是一个数据对象,但您尝试将其传递给公式。 R plot()通过方法实现了这一点 - 当x是公式时,会调度plot.formula()方法而非基本plot.default()方法。

您需要这样做:

myplot <- function(x, ...)
    UseMethod("myplot")

myplot.default <- function(x, ....) {
    isBad <- any((length(x) > 10^6) || (object.size(x) > 8*10^6) || 
                    (nrow(x) > 10^6))
    if(is.na(isBad)){isBad = FALSE}
    if(isBad){
        stop("No plots for you!")
    }
    invisible(plot(x, ...))
}

myplot.formula <- function(x, ...) {
    ## code here to process the formula into a data object for plotting
    ....
    myplot.default(processed_x, ...)
}

您可以窃取plot.formula()中的代码,以便在将x处理成对象所需的代码中使用。或者,您可以按照standard non-standard evaluation rules (PDF)

滚动自己