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的大小 - 否则在慢速绘图中会有很多痛苦.:)
您遇到的问题是,当前编码时,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)自行推出.