【问题标题】:Wrapping R's plot function (or ggplot2) to prevent plotting of large data sets包装 R 的绘图函数(或 ggplot2)以防止绘制大型数据集
【发布时间】:2011-12-08 10:19:58
【问题描述】:

我不想问如何绘制大数据集,而是想包装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:在测试想法时,我建议测试大小> 100(或设置变量,例如myThreshold &lt;- 1000),而不是与> 1M的大小相比 - 否则会遇到很多痛苦绘图。 :)

【问题讨论】:

    标签: r plot ggplot2 bigdata


    【解决方案1】:

    您遇到的问题是,按照当前的编码,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) 之后自行滚动。

    【讨论】:

    • +1 了解正在发生的事情以及指向标准非标准参考的非常有用的指针。你能澄清我在哪里可以找到plot.formula 的代码吗?我想任何从公式中提取对象的代码都可以工作,所以我也在寻找它。
    • @Iterator graphics:::plot.formulagetAnywhere(plot.formula) 将显示代码。 methods(plot) 将显示可用于通用绘图的 S3 方法。请注意,plot.formulamethods() 的输出中显示为带有*,表示函数本身并未从命名空间导出;相反,它被注册为 S3 调度方法。
    • @Iterator 为了从公式中提取对象,标准的非标准规则是 R 中的主流范式 - plot.formula 似乎使用了这个成语,尽管由于该函数的需要而变得更加复杂获取从公式中提取的对象名称的信息,用于标记绘图轴。有关提取对象所需的主要步骤的更简单详细信息,请参阅我链接到的 PDF。您还需要在公式方法中使用比我展示的更多的参数。再次查看 PDF,了解充分利用此成语所需的论据。
    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2014-02-21
    相关资源
    最近更新 更多