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

Ite*_*tor 7 plot r bigdata ggplot2

而不是询问如何绘制大数据集,我想要包装,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)
Run Code Online (Sandbox Code Playgroud)

失败的示例:

x = rnorm(1000)
y = rnorm(1000)
plot(y ~ x)
myPlot(y ~ x)
Run Code Online (Sandbox Code Playgroud)

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


注1:在测试想法时,我建议测试大小> 100(或设置一个变量,例如myThreshold <- 1000),而不是大于> 1M的大小 - 否则在慢速绘图中会有很多痛苦.:)

Rei*_*son 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, ...)
}
Run Code Online (Sandbox Code Playgroud)

您可以窃取代码,plot.formula()以便在处理x对象所需的代码中使用.或者,您可以按照标准的非标准评估规则(PDF)自行推出.